La comparaison de l'objet de représentation du graphe d'adjacence de la liste et de la matrice des représentations
Je suis en train de Steve Yegge de conseils sur la préparation d'une programmation technique d'entrevue: http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html
Dans sa section sur les Graphiques, il déclare:
Il existe trois méthodes de base pour
représenter le graphe dans la mémoire (des objets
et des pointeurs, de la matrice, et la contiguïté
liste), et vous devriez vous familiariser
vous-même à chaque représentation et
ses avantages et inconvénients.
Les avantages et les inconvénients de la matrice et de la contiguïté liste des représentations sont décrites en CLRS, mais je n'ai pas été en mesure de trouver une ressource que de les comparer à un objet de représentation.
Rien qu'en pensant à elle, je peux déduire quelques de moi-même, mais je voudrais m'assurer que je n'ai pas manqué quelque chose d'important. Si quelqu'un pouvait le décrire de manière exhaustive, ou me diriger vers une ressource qui agit de la sorte, je vous en serais très reconnaissante.
- que diriez - inductif graphiques — laquelle de ces 3 catégories de ces tomber sous?
Vous devez vous connecter pour publier un commentaire.
des objets et des pointeurs
Ce sont juste des structures de données de base comme hammar a dit dans l'autre réponse, en
Java
vous représenter ce avec des classes comme les arêtes et les sommets. Par exemple une arête relie deux sommets et peut être orienté ou non orienté, et il peut contenir un poids. Un sommet peut avoir un ID, nom, etc. Surtout deux d'entre eux ont des propriétés supplémentaires. De sorte que vous pouvez construire votre graphique avec eux commeCette approche est couramment utilisé pour l'orienté objet implémentations, car il est plus lisible et pratique pour objet orienté vers les utilisateurs ;).
matrice
Une matrice est juste un simple 2 dimensions tableau. En supposant que vous avez des ID de sommet qui peut être représenté comme un tableau int comme ceci:
Ceci est couramment utilisé pour les dense graphiques où l'indice d'accès est nécessaire. Vous pouvez représenter des nations unies/mise en scène et pondérée de la structure.
liste d'adjacence
C'est juste une simple discbased mix, j'ai l'habitude de mettre en œuvre ce à l'aide d'un
HashMap<Vertex, List<Vertex>>
. Similaire utilisé peut être leHashMultimap
dans la Goyave.Cette approche est cool, parce que vous avez O(1) (amorti) vertex de recherche et il me renvoie une liste de tous les sommets adjacents à ce vertex j'ai demandé.
Ce est utilisé pour représenter les graphes éparses, si vous demandez à Google, vous devez savoir que le webgraph est clairsemée. Vous pouvez répondre dans les plus de manière évolutive à l'aide d'un BigTable.
Oh et BTW, ici est un très bon résumé de ce post avec de jolis photos 😉
HashMap
(docs.oracle.com/javase/7/docs/api/java/util/HashMap.html), il est dit:This implementation provides constant-time performance for the basic operations
= O(1) amorti.HashTable
d'utilisation. Donc pas besoin de pinailler balader avec une petite constante alpha frais généraux qui peuvent être négligés.Edge
objet, tandis que hammar est de garder les pointeurs pour les voisins de donner des noms explicites. Mais vous dites que "ce sont juste des structures de données de base comme hammar a dit dans l'autre réponse". Voulez-vous faire de cela un peu plus clair?Des objets et des pointeurs est essentiellement le même que la contiguïté de la liste, au moins pour fins de comparaison entre les algorithmes qui utilisent ces représentations.
Comparer
avec
Vous pouvez facilement construire la liste des voisins à la volée dans ce dernier cas, si c'est plus facile à travailler que nommé pointeurs.
Avantage de la représentation d'objet (l'incidence de la liste) est que deux sommets adjacents partagent la même instance de l'arête. Cela rend plus facile à manipuler avec des non-orienté de données edge (durée, coût, le débit ou même direction). Cependant, il utilise de la mémoire supplémentaire pour les pointeurs.
Une autre bonne ressource: Khan Academy - "Le Fait De Représenter Des Graphes"
En plus de liste d'adjacence et de la matrice de contiguïté, on trouve une liste de "bord de listes" comme un 3ème type de représentation graphique. Un bord liste pourrait être interprété comme une liste de "edge objets" comme ceux de Thomas "des objets et des pointeurs" réponse.
Avantage: On peut stocker plus d'informations sur l'arête (mentionné par Michal)
Inconvénient: C'est un très lente structure de données pour travailler avec:
e = nombre d'arêtes