Powiedziano mi, że użyjemy listy, jeśli wykres jest rzadki, a macierzy, jeśli wykres jest gęsty . Dla mnie to tylko surowa definicja. Nie widzę wiele poza tym. Czy możesz wyjaśnić, kiedy byłby to naturalny wybór?
Z góry dziękuję!
graphs
data-structures
lists
adjacency-matrix
użytkownik21312
źródło
źródło
Odpowiedzi:
Przede wszystkim zauważ, że rzadki oznacza, że masz bardzo mało krawędzi, a gęsty oznacza wiele krawędzi lub prawie pełny wykres. Na pełnym wykresie masz krawędzi, gdzie jest liczbą węzłów.nn(n−1)/2 n
Teraz, gdy używamy reprezentacji macierzowej, alokujemy macierzy do przechowywania informacji o połączeniach węzłów, np. jeśli istnieje krawędź między węzłami i , w przeciwnym razie . Ale jeśli użyjemy listy przyległości, mamy tablicę węzłów i każdy węzeł wskazuje na swoją listę przyległości zawierającą TYLKO sąsiednie węzły .M [ i ] [ j ] = 1 i j M [ i ] [ j ] = 0n×n M[i][j]=1 i j M[i][j]=0
Teraz, jeśli wykres jest rzadki i korzystamy z reprezentacji macierzy, wówczas większość komórek macierzy pozostaje nieużywana, co prowadzi do marnowania pamięci. Dlatego zwykle nie używamy reprezentacji macierzowej dla rzadkich wykresów. Wolimy listę sąsiadów.
Ale jeśli wykres jest gęsty, liczba krawędzi jest zbliżona do (pełnego) lub do jeśli wykres jest skierowany za pomocą pętli własnych. Wówczas nie ma przewagi, aby używać listy sąsiedztwa nad macierzą.n 2n(n−1)/2 n2
Pod względem złożoności przestrzeniO(n2)
O(n+m)
n m
Macierz adiakencji: Lista adjacencji: gdzie jest liczbą węzłów, jest liczbą krawędzi.O ( n + m ) n m
Gdy wykres jest drzewem bezkierunkowym, wówczasO(n2)
O(n+n) O(n) n2
macierz adiakencji: Lista adjacencji: to (lepiej niż )O ( n + n ) O ( n ) n 2
Gdy wykres jest skierowany, kompletny, z pętlami własnymi, toO(n2)
O(n+n2) O(n2)
macierz adiakencji: Lista adjacencji: to (bez różnicy)O ( n + n 2 ) O ( n 2 )
I na koniec, kiedy implementujesz za pomocą macierzy, sprawdzenie, czy istnieje krawędź między dwoma węzłami, zajmuje razy, natomiast w przypadku listy przyległości może zająć czas liniowy w .nO(1) n
źródło
Aby odpowiedzieć, podając prostą analogię. Gdybyś musiał przechowywać 6 uncji wody, czy (ogólnie rzecz biorąc) zrobiłbyś to z pojemnikiem o pojemności 5 galonów lub kubkiem o pojemności 8 uncji?
Wracając do pytania… Jeśli większość macierzy jest pusta, to po co z niej korzystać? Zamiast tego wystarczy wymienić każdą wartość. Jeśli jednak twoja lista jest naprawdę długa, dlaczego nie użyć matrycy, aby ją skondensować?
W tym przypadku uzasadnienie listy vs macierzy jest naprawdę takie proste.
PS lista to tak naprawdę tylko macierz jednokolumnowa !!! (próbuje pokazać, jak arbitralna jest decyzja / scenariusz)
źródło
Rozważ wykres z węzłami i krawędziamiIgnorując warunki niskiego rzędu, matryca bitowa dla wykresu używa bitów bez względu na liczbę krawędzi.E N 2N E N2
Ile bitów tak naprawdę potrzebujesz?
Zakładając, że krawędzie są niezależne, liczba wykresów z węzłami i krawędziami wynosi . Minimalna liczba bitów wymagana do przechowywania tego podzbioru wynosi .E ( N 2N E (N2E) log2(N2E)
Przyjmiemy bez utraty ogólności, że , to znaczy, że połowa lub mniej krawędzi jest obecnych. Jeśli tak nie jest, możemy zamiast tego zapisać zestaw „bez krawędzi”.E≤N22
Jeśli , , więc reprezentacja macierzy jest asymptotycznie optymalna. Jeśli , stosując przybliżenie Stirlinga i trochę arytmetyki, znajdziemy:E=N22 log2(N2E)=N2+o(N2) E≪N2
Jeśli weźmiesz pod uwagę, że jest rozmiarem liczby całkowitej, która może reprezentować indeks węzła, optymalną reprezentacją jest tablica identyfikatorów węzłów , czyli tablica par indeksów węzłów.2 Elog2N 2E
To powiedziawszy, dobrą miarą rzadkości jest entropia, która jest również liczbą bitów na krawędź optymalnej reprezentacji. Jeśli jest prawdopodobieństwem obecności krawędzi, entropia to . Dla entropia wynosi 2 (tj. Dwa bity na krawędź w optymalnej reprezentacji), a wykres jest gęsty. Jeśli entropia jest znacznie większa niż 2, a zwłaszcza jeśli jest zbliżona do wielkości wskaźnika, wykres jest rzadki. -log2p(1-p)p≈1p=EN2 −log2p(1−p) p≈12
źródło