Représentant des graphes (structure de données) en Python
Comment peut-on soigneusement représentent un graphique dans Python? (À partir de zéro c'est à dire pas de bibliothèques!)
Quelle structure de données (par exemple, dicts/n-uplets/dict(tuples)) sera rapide mais aussi efficace en terme de mémoire?
On doit être capables de faire diverses graphique les opérations de sur elle.
Comme l'a souligné, les différents graphique des représentations pourrait aider. Comment fait-on pour les mettre en œuvre en Python?
Comme pour les bibliothèques, cette question a assez de bonnes réponses.
- Il y a beaucoup de bibliothèques déjà: graph-tool.skewed.de/performance, code.google.com/p/python-graph, networkx.github.io
- Pour la mise en œuvre d'un Graphe d'oeil à l'article de Wikipedia qui répertorie commune de mise en œuvre et de leur efficacité à la fois de la mémoire et de la vitesse: en.wikipedia.org/wiki/...
- Vous pouvez essayer de GitHub.com/thePastor/pangaia. Il a besoin d'un peu de réécriture de l'utilisation de la bibliothèque standard du defaultdict (ce qui n'est pas lorsque le code a été écrit). Il utilise une structure de données récursive pour le rendre plus élégant que d'autres implémentations.
Vous devez vous connecter pour publier un commentaire.
Même si c'est un peu vieille question, j'ai pensé donner une réponse pratique pour quiconque de tomber sur ce.
Disons que vous obtenez vos données d'entrée pour vos connexions comme une liste de tuples de la sorte:
La structure de données que j'ai trouvé pour être le plus utile et efficace pour les graphiques en Python est un dict de jeux de. Ce sera la structure sous-jacente de notre
Graph
classe. Vous devez également savoir si ces connexions sont des arcs (mise en scène, connecter d'une manière) ou les bords (non orienté, connectez les deux sens). Nous prenons en charge que par l'ajout d'undirected
paramètre à laGraph.__init__
méthode. Nous allons également ajouter quelques autres méthodes utiles.Je vais le laisser comme un "exercice pour le lecteur" afin de créer un
find_shortest_path
et d'autres méthodes.Nous allons le voir en action, mais...
heapq
lib à heapify listes de n-uplets au lieu de jeux. Par exemple, le graphique serait un dict des tas comme:_graph = {'A': heapify([(0.3, 'D'), (0.5, 'B'), (0.75, 'A'), (0.9, 'C')])}
(remarque: vous ne pourriez pas l'utiliser réellementheapify
comme cela, lire l'aide pour la lib), alors vous pouvez utiliser lesheapq
fonctions d'insérer et d'obtenir la pondération des arêtes.log
temps d'accès. Mais comment étendre le dictionnaire que vous avez utilisé pour mapper les deux nodeID et le poids?NetworkX est un jeu génial de Python graphique de la bibliothèque. Vous aurez du mal à trouver quelque chose que vous avez besoin qu'il n'est pas déjà le faire.
Et il est open source, donc vous pouvez voir comment ils ont mis en œuvre leurs algorithmes. Vous pouvez également ajouter d'autres algorithmes.
https://github.com/networkx/networkx/tree/master/networkx/algorithms
graph.py --> class Graph
. Et tout ce que je veux, c'est voir comment ils utilisent__iter__
.Tout d'abord, le choix de la classique liste vs matrice représentations dépend de l'objectif (sur ce que vous voulez faire avec la représentation). Les problèmes bien connus et les algorithmes sont liées au choix. Le choix de la représentation abstraite genre de dicte la façon dont il devrait être mis en œuvre.
Second lieu, la question est de savoir si les sommets et les arêtes doivent être exprimé uniquement dans les conditions d'existence, ou s'ils portent des informations supplémentaires.
De Python les types de données intégrés point de vue, toute valeur contenue ailleurs est exprimée en (caché) une référence à l'objet cible. Si c'est une variable (c'est à dire nommé référence), puis le nom et la référence est toujours stockée en interne) dictionnaire. Si vous n'avez pas besoin de noms, il peut être stocké dans votre propre conteneur -- ici, probablement, liste Python sera toujours utilisé pour la liste comme une abstraction.
Liste Python est implémenté sous la forme d'un tableau dynamique de références, Python tuple est mis en œuvre comme statique tableau de références avec la constante de contenu (la valeur de références ne peut pas être changé). En raison de qu'ils peuvent être facilement indexé. De cette façon, la liste peut être également utilisé pour la mise en œuvre de matrices.
Une autre façon de représenter les matrices sont des tableaux mis en œuvre par le module standard
array
-- plus de contrainte à l'égard de la stockées type, valeur homogène. Les éléments de stocker la valeur directement. (La liste des magasins les références à la valeur des objets à la place). De cette façon, il est plus efficace en terme de mémoire et aussi l'accès à la valeur est plus rapide.Parfois, vous pouvez trouver utile encore plus restreint de la représentation comme
bytearray
.Il y a deux excellents graphique bibliothèques
NetworkX et igraph. Vous pouvez trouver à la fois bibliothèque de codes sources sur GitHub. Vous pouvez toujours voir comment les fonctions sont écrites. Mais je préfère NetworkX parce qu'elle est facile à comprendre.
Voir les codes pour savoir comment ils font les fonctions. Vous obtiendrez de multiples idées et ensuite pouvez choisir comment vous voulez faire un graphique à l'aide de structures de données.