Myślę, że twój pierwszy przykład jest trochę niejednoznaczny - węzły jako obiekty i krawędzie jako wskaźniki. Możesz je śledzić, przechowując tylko wskaźnik do jakiegoś węzła głównego, w którym to przypadku dostęp do danego węzła może być nieefektywny (np. Chcesz, aby węzeł 4 - jeśli obiekt węzła nie jest dostarczony, być może będziesz musiał go wyszukać) . W takim przypadku można również stracić fragmenty wykresu, które nie są osiągalne z węzła głównego. Myślę, że tak właśnie jest w przypadku f64 rainbow, kiedy mówi, że złożoność czasu dostępu do danego węzła to O (n).
W przeciwnym razie można również przechowywać tablicę (lub mieszającą) pełną wskaźników do każdego węzła. Pozwala to na dostęp O (1) do danego węzła, ale zwiększa nieco wykorzystanie pamięci. Jeśli n to liczba węzłów, a e to liczba krawędzi, złożoność tego podejścia będzie wynosić O (n + e).
Złożoność przestrzeni dla podejścia macierzowego będzie przebiegać wzdłuż linii O (n^2) (zakładając, że krawędzie są jednokierunkowe). Jeśli twój wykres jest rzadki, będziesz miał wiele pustych komórek w macierzy. Ale jeśli twój wykres jest w pełni połączony (e = n^2), to korzystnie wpływa na pierwsze podejście. Jak mówi RG, możesz również mieć mniejszy brak pamięci podręcznej z tym podejściem, jeśli przydzielisz matrycę jako jedną porcję pamięci, co może przyspieszyć wykonywanie wielu krawędzi wokół wykresu.
Trzecie podejście jest prawdopodobnie najbardziej efektywne pod względem przestrzeni w przypadku większości przypadków - O (e) - ale powoduje, że znalezienie wszystkich krawędzi danego węzła jest zadaniem O (e). Nie mogę wymyślić przypadku, w którym byłoby to bardzo przydatne.
Rozważałbym matrycę tylko wtedy, gdy wykres był bardzo połączony lub bardzo mały. W przypadku rzadko połączonych wykresów, podejście do obiektu/wskaźnika lub listy krawędzi przyniosłoby znacznie lepsze wykorzystanie pamięci. Ciekawi mnie, co oprócz pamięci, którą przeoczyłem. ;) – sarnold
Różnią się również złożonością czasu, macierz to O (1), a pozostałe reprezentacje mogą się znacznie różnić w zależności od tego, czego szukasz. – msw
Pamiętam lekturę artykułu opisującego zalety sprzętowe implementacji wykresu jako matrycy na liście wskaźników. Nie pamiętam wiele z tego, poza tym, że mając do czynienia z ciągłym blokiem pamięci, w dowolnym momencie wiele z twojego zestawu roboczego może być dobrze w pamięci podręcznej L2. Z drugiej strony lista węzłów/wskaźników może być blokowana przez pamięć i prawdopodobnie będzie wymagać pobrania, które nie trafi do pamięci podręcznej. Nie jestem pewien, czy się zgadzam, ale to ciekawa myśl. – nerraga