À la recherche du type de données manquant
- Un graphe est un ensemble de nœuds reliés par des flèches (arêtes).
- Les nœuds et les arêtes peuvent contenir des données.
- En génie logiciel, les graphes existent sous de nombreuses formes : dépendances de paquets, liens Internet, espace d’états d’un logiciel, bases de données relationnelles, listes chaînées, arbres binaires, tables de hachage, etc.
- Dans la logique métier aussi, les graphes sont utilisés pour les références entre citations, les réseaux de transport, les réseaux sociaux, etc.
- Plus on fait du développement logiciel longtemps, plus il est probable de rencontrer des graphes partout.
Réflexions sur l’usage des graphes
- Les graphes sont utiles, mais les utiliser dans du vrai code reste contraignant.
- La plupart des langages grand public ne prennent pas en charge les graphes comme type intégré, c’est rare même dans les bibliothèques standard, et il n’existe pas tant de bibliothèques tierces robustes.
- Il faut souvent implémenter les graphes soi-même.
- Il existe un écart entre la fréquence à laquelle les ingénieurs logiciels peuvent avoir besoin de graphes et le niveau de support offert par l’écosystème de programmation.
Pourquoi il n’existe pas de type graphe
Trop de choix de conception
- Il existe de nombreux types de graphes : orientés ou non orientés, graphes simples ou multigraphes, hypergraphes, ubergraphes, etc.
- Pour chaque type, il faut décider s’il faut attribuer des ID aux nœuds et aux arêtes, ainsi que quelles données y stocker.
- Une bibliothèque de graphes parfaite couvrant toutes les possibilités demanderait énormément de temps.
- Les performances des algorithmes de graphes sont importantes, et les cas particuliers comptent.
- Les algorithmes de graphes sont difficiles à implémenter correctement.
Trop de choix d’implémentation
- Même en supposant qu’on ne veuille prendre en charge qu’un simple graphe orienté, il existe plusieurs façons de représenter un graphe en interne.
- Il existe différents modes de stockage : liste d’arêtes, liste d’adjacence, matrice d’adjacence, ensemble de structures, etc.
- Les différentes opérations sur les graphes ont des caractéristiques de performance différentes selon la représentation choisie.
- Selon qu’un graphe est clairsemé ou dense, la représentation interne optimale change.
- Implémenter des données de nœuds, des données d’arêtes, ainsi que différents types de nœuds et d’arêtes rend la situation encore plus complexe.
Les performances sont trop importantes
- Beaucoup d’algorithmes de graphes relèvent de problèmes NP-complets, voire plus difficiles.
- Les graphes peuvent devenir très grands, et les performances varient fortement selon la représentation et les détails d’implémentation des algorithmes.
- Il faut disposer d’un contrôle important sur la représentation des données et les algorithmes.
Le constat partagé
- La variété des types de graphes, des représentations, des algorithmes, leur sensibilité aux performances, ainsi que l’exécution d’algorithmes coûteux sur de grands graphes expliquent pourquoi leur prise en charge n’est pas généralisée.
- Cela explique pourquoi les langages ne prennent pas en charge les graphes dans leur bibliothèque standard.
- Cela explique aussi pourquoi les programmeurs évitent les bibliothèques tierces de graphes.
- Comme l’usage des graphes est difficile, on préfère souvent éviter de penser en termes de graphes sauf dans des situations extrêmes.
L’avis de GN⁺
- Cet article apporte un éclairage sur les raisons pour lesquelles les graphes ne se sont pas imposés comme type de données fondamental dans les langages et bibliothèques de programmation.
- La théorie des graphes est un domaine important de l’informatique, avec des applications dans les algorithmes, l’analyse de réseaux, les bases de données et bien d’autres domaines.
- Pour utiliser efficacement les graphes, l’optimisation des performances et le choix d’une structure de données adaptée sont essentiels.
- Parmi les bibliothèques tierces, on peut citer NetworkX, Boost Graph Library et Graph-tool, qui peuvent servir à résoudre divers problèmes liés aux graphes.
- Lorsqu’on utilise des graphes, il est important de choisir le type de graphe et l’algorithme adaptés aux caractéristiques du problème, car cela a un impact direct sur les performances du système.
1 commentaires
Commentaires sur Hacker News
Graphviz possède sa propre bibliothèque de graphes, qui n’est pas utilisée dans d’autres projets. Cette bibliothèque a des avantages et des inconvénients.
Si vous codez en .NET, vous devriez essayer Arborescence, une petite bibliothèque de graphes peu riche en fonctionnalités.
Un graphe n’est ni une structure de données ni un type de données, c’est une abstraction.
On m’a souvent demandé pourquoi il n’existe pas de type de données graphe intégré aux langages de programmation.
L’obstacle central est le suivant :
Cet article répond en grande partie à la question de savoir pourquoi les algorithmes de graphes ne sont pas mieux pris en charge dans les langages de programmation.
Les outils de dessin de graphes sont eux aussi très décevants.
Cet article est vraiment génial.
Electric Clojure utilise Clojure lui-même (les s-expressions) comme syntaxe d’écriture de graphes.
Il existe un autre type de données utile, comme les tables (par exemple les tables dans une base de données).