Mir wurde gesagt, dass wir eine Liste verwenden würden, wenn der Graph dünn ist, und eine Matrix, wenn der Graph dicht ist . Für mich ist es nur eine grobe Definition. Ich sehe nicht viel darüber hinaus. Können Sie klarstellen, wann dies die natürliche Wahl wäre?
Danke im Voraus!
graphs
data-structures
lists
adjacency-matrix
user21312
quelle
quelle
Antworten:
Zuallererst bedeutet " dünn" , dass Sie nur sehr wenige Kanten haben, und " dicht" bedeutet "viele Kanten" oder "fast vollständiges Diagramm". In einem vollständigen Diagramm haben Sie Kanten, wobei n die Anzahl der Knoten ist.n(n−1)/2 n
Wenn wir nun eine Matrixdarstellung verwenden , weisen wir eine Matrix zu, um Knotenverbindungsinformationen zu speichern, z. B. M [ i ] [ j ] = 1, wenn es eine Kante zwischen den Knoten i und j gibt , andernfallsn×n M[i][j]=1 i j .
Wenn wir jedoch die Adjazenzliste verwenden, haben wir ein Array von Knoten, und jeder Knoten zeigt auf seine Adjazenzliste,die NUR seine Nachbarknoten enthält.M[i][j]=0
Wenn ein Graph spärlich ist und wir eine Matrixdarstellung verwenden, bleiben die meisten Matrixzellen ungenutzt, was zur Verschwendung von Speicher führt. Daher verwenden wir normalerweise keine Matrixdarstellung für spärliche Diagramme. Wir bevorzugen die Nachbarschaftsliste.
Wenn der Graph jedoch dicht ist, liegt die Anzahl der Kanten nahe an (dem vollständigen) oder nahe an n 2, wenn der Graph mit Selbstschleifen ausgerichtet ist. In diesem Fall bietet die Verwendung der Adjazenzliste keinen Vorteil gegenüber der Matrix.n(n−1)/2 n2
In Bezug auf die RaumkomplexitätO(n2)
O(n+m)
n m
Adjazenzmatrix: Adjazenzliste: O ( n + m ) wobei n die Anzahl der Knoten und m die Anzahl der Kanten ist.
Wenn der Graph ein ungerichteter Baum ist, dannO(n2)
O(n+n) O(n) n2
Adjazenzmatrix: Adjazenzliste: O ( n + n ) ist O ( n ) (besser als n 2 )
Wenn der Graph gerichtet ist, vollständig mit Selbstschleifen, dannO(n2)
O(n+n2) O(n2)
Adjazenzmatrix: Adjazenzliste: O ( n + n 2 ) ist O ( n 2 ) (kein Unterschied)
Wenn Sie schließlich die Verwendung einer Matrix implementieren, dauert die Überprüfung, ob eine Kante zwischen zwei Knoten vorhanden ist, Mal, während es bei einer Adjazenzliste in n möglicherweise eine lineare Zeit dauert .O(1) n
quelle
Um mit einer einfachen Analogie zu antworten: Wenn Sie 6 Unzen Wasser aufbewahren müssten, würden Sie dies (im Allgemeinen) mit einem 5-Gallonen-Behälter oder einer 8-Unzen-Tasse tun?
Kommen wir nun zu Ihrer Frage zurück. Wenn der Großteil Ihrer Matrix leer ist, warum sollten Sie sie dann verwenden? Listen Sie stattdessen jeden Wert auf. Wenn Ihre Liste jedoch sehr lang ist, warum nicht einfach eine Matrix verwenden, um sie zu verdichten?
Die Argumentation hinter list vs matrix ist in diesem Fall wirklich so einfach.
PS eine Liste ist wirklich nur eine einzelne Spaltenmatrix !!! (Ich versuche dir zu zeigen, wie willkürlich eine Entscheidung / ein Szenario ist)
quelle
Betrachten Sie einen Graphen mit Knoten und E Kanten. Ohne Berücksichtigung von Termen niedriger Ordnung verwendet eine Bitmatrix für einen Graphen N 2 Bits, unabhängig von der Anzahl der Kanten.N E N2
Wie viele Bits brauchst du eigentlich?
Unter der Annahme, dass Kanten unabhängig sind, beträgt die Anzahl der Graphen mit Knoten und E Kanten ( N 2N E . Die minimale Anzahl von Bits, die erforderlich sind, um diese Teilmenge zu speichern, istlog2 ( N2(N2E) .log2(N2E)
Wir gehen ohne Einschränkung der Allgemeinheit davon aus, dass , das heißt, dass die Hälfte oder weniger der Kanten vorhanden sind. Ist dies nicht der Fall, können wir stattdessen die Menge der "Nichtkanten" speichern.E≤N22
Wenn ,log2 ( N 2E=N22 log2(N2E)=N2+o(N2) , so the matrix representation is asymptotically optimal. If E≪N2 , using Stirling's approximation and a little arithmetic, we find:
If you consider thatlog2N is the size of an integer which can represent a node index, the optimal representation is an array of 2E node ids, that is, an array of pairs of node indexes.
Having said that, a good measure of sparsity is the entropy, which is also the number of bits per edge of the optimal representation. Ifp=EN2 is the probability that an edge is present, the entropy is −log2p(1−p) . For p≈12 , the entropy is 2 (i.e. two bits per edge in the optimal representation), and the graph is dense. If the entropy is significantly greater than 2, and in particular if it's close to the size of a pointer, the graph is sparse.
quelle