Ich folge derzeit Steve Yegges Ratschlägen zur Vorbereitung eines technischen Programmierinterviews: http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html
In seinem Abschnitt über Grafiken stellt er fest:
Es gibt drei grundlegende Möglichkeiten, ein Diagramm im Speicher darzustellen (Objekte und Zeiger, Matrix und Adjazenzliste), und Sie sollten sich mit jeder Darstellung und ihren Vor- und Nachteilen vertraut machen.
Die Vor- und Nachteile von Matrix- und Adjazenzlistendarstellungen sind in CLRS beschrieben, aber ich konnte keine Ressource finden, die diese mit einer Objektdarstellung vergleicht.
Wenn ich nur darüber nachdenke, kann ich selbst auf etwas davon schließen, aber ich möchte sicherstellen, dass ich etwas Wichtiges nicht verpasst habe. Wenn jemand dies umfassend beschreiben oder mich auf eine Ressource verweisen könnte, die dies tut, würde ich es sehr schätzen.
quelle
Antworten:
Objekte und Zeiger
Dies sind nur grundlegende Datenstrukturen, wie Hammar in der anderen Antwort sagte.
Java
Sie würden dies mit Klassen wie Kanten und Eckpunkten darstellen. Beispielsweise verbindet eine Kante zwei Eckpunkte und kann entweder gerichtet oder ungerichtet sein und ein Gewicht enthalten. Ein Scheitelpunkt kann eine ID, einen Namen usw. haben. Meistens haben beide zusätzliche Eigenschaften. So können Sie Ihr Diagramm mit ihnen wie erstellenDieser Ansatz wird üblicherweise für objektorientierte Implementierungen verwendet, da er für objektorientierte Benutzer lesbarer und bequemer ist;).
Matrix
Eine Matrix ist nur ein einfaches zweidimensionales Array. Angenommen, Sie haben Scheitelpunkt-IDs, die wie folgt als int-Array dargestellt werden können:
Dies wird häufig für dichte Diagramme verwendet, bei denen ein Indexzugriff erforderlich ist. Damit können Sie eine ungerichtete und gewichtete Struktur darstellen.
Adjazenzliste
Dies ist nur ein einfacher Datenstruktur-Mix, den ich normalerweise mit einem implementiere
HashMap<Vertex, List<Vertex>>
. Ähnlich verwendet kann dasHashMultimap
in Guave sein.Dieser Ansatz ist cool, da Sie eine O (1) (amortisierte) Scheitelpunktsuche haben und mir eine Liste aller benachbarten Scheitelpunkte zu diesem bestimmten Scheitelpunkt zurückgeben, den ich angefordert habe.
Dies wird zur Darstellung spärlicher Diagramme verwendet. Wenn Sie sich bei Google bewerben, sollten Sie wissen, dass der Webgraph spärlich ist. Mit einem BigTable können Sie skalierbarer mit ihnen umgehen .
Oh und übrigens, hier ist eine sehr gute Zusammenfassung dieses Beitrags mit ausgefallenen Bildern;)
quelle
HashMap
( docs.oracle.com/javase/7/docs/api/java/util/HashMap.html ), in dem steht:This implementation provides constant-time performance for the basic operations
= O (1) amortisiert.HashTable
Nutzung. Sie müssen also nicht mit einem kleinen konstanten Alpha-Overhead herumpicken, der vernachlässigt werden kann.Objekte und Zeiger entsprechen größtenteils der Adjazenzliste, zumindest um Algorithmen zu vergleichen, die diese Darstellungen verwenden.
Vergleichen Sie
mit
Im letzteren Fall können Sie die Liste der Nachbarn einfach im laufenden Betrieb erstellen, wenn die Arbeit mit benannten Zeigern einfacher ist.
quelle
Vorteil der Objektdarstellung ( Inzidenzliste ) ist, dass zwei benachbarte Eckpunkte dieselbe Instanz der Kante teilen. Dies erleichtert die Bearbeitung mit ungerichteten Kantendaten (Länge, Kosten, Durchfluss oder sogar Richtung). Es wird jedoch zusätzlicher Speicher für Zeiger verwendet.
quelle
Eine weitere gute Ressource: Khan Academy - "Representing Graphs"
Neben der Adjazenzliste und der Adjazenzmatrix werden "Kantenlisten" als dritte Art der Diagrammdarstellung aufgeführt. Eine Kantenliste könnte als Liste von "Kantenobjekten" interpretiert werden, wie sie in Thomas 'Antwort "Objekte und Zeiger" enthalten sind.
Vorteil: Wir können weitere Informationen über die Kante speichern (von Michal erwähnt)
Nachteil: Es ist eine sehr langsame Datenstruktur, mit der man arbeiten kann:
e = Anzahl der Kanten
quelle