Diese Antwort gilt nicht nur für C ++, da sich alles, was erwähnt wird, auf die Datenstrukturen selbst bezieht, unabhängig von der Sprache. Meine Antwort geht davon aus, dass Sie die Grundstruktur von Adjazenzlisten und -matrizen kennen.
Erinnerung
Wenn der Speicher Ihr Hauptanliegen ist, können Sie diese Formel für ein einfaches Diagramm befolgen, das Schleifen zulässt:
Eine Adjazenzmatrix nimmt n 2 /8 - Byte - Raum (ein Bit pro Eintrag).
Eine Adjazenzliste belegt 8e Platz, wobei e die Anzahl der Kanten ist (32-Bit-Computer).
Wenn wir die Dichte des Graphen als d = e / n 2 definieren (Anzahl der Kanten geteilt durch die maximale Anzahl der Kanten), können wir den "Haltepunkt" finden, an dem eine Liste mehr Speicherplatz beansprucht als eine Matrix:
8e> n 2 /8 , wenn d> 1/64
Mit diesen Zahlen (immer noch 32-Bit-spezifisch) landet der Haltepunkt also bei 1/64 . Wenn die Dichte (e / n 2 ) größer als 1/64 ist, ist eine Matrix vorzuziehen, wenn Sie Speicher sparen möchten.
Sie können darüber auf Wikipedia (Artikel über Adjazenzmatrizen) und vielen anderen Websites lesen .
Randnotiz : Sie können die Raumeffizienz der Adjazenzmatrix verbessern, indem Sie eine Hash-Tabelle verwenden, bei der die Schlüssel Paare von Eckpunkten sind (nur ungerichtet).
Iteration und Nachschlagen
Adjazenzlisten sind eine kompakte Methode, um nur vorhandene Kanten darzustellen. Dies geht jedoch zu Lasten einer möglicherweise langsamen Suche nach bestimmten Kanten. Da jede Liste so lang ist wie der Grad eines Scheitelpunkts, kann die Suchzeit im ungünstigsten Fall für die Überprüfung einer bestimmten Kante O (n) werden, wenn die Liste ungeordnet ist. Das Nachschlagen der Nachbarn eines Scheitelpunkts wird jedoch trivial, und für ein spärliches oder kleines Diagramm können die Kosten für das Durchlaufen der Adjazenzlisten vernachlässigbar sein.
Adjazenzmatrizen hingegen benötigen mehr Platz, um eine konstante Suchzeit zu gewährleisten. Da jeder mögliche Eintrag vorhanden ist, können Sie mithilfe von Indizes in konstanter Zeit prüfen, ob eine Kante vorhanden ist. Die Nachbarsuche benötigt jedoch O (n), da Sie alle möglichen Nachbarn überprüfen müssen. Der offensichtliche Platznachteil besteht darin, dass bei spärlichen Diagrammen viel Polsterung hinzugefügt wird. Weitere Informationen hierzu finden Sie in der obigen Speicherdiskussion.
Wenn Sie sich immer noch nicht sicher sind, was Sie verwenden sollen : Die meisten Probleme in der realen Welt erzeugen spärliche und / oder große Diagramme, die sich besser für die Darstellung von Adjazenzlisten eignen. Sie scheinen schwieriger zu implementieren zu sein, aber ich versichere Ihnen, dass dies nicht der Fall ist. Wenn Sie ein BFS oder DFS schreiben und alle Nachbarn eines Knotens abrufen möchten, sind sie nur eine Codezeile entfernt. Beachten Sie jedoch, dass ich Adjazenzlisten im Allgemeinen nicht bewerbe.