Seznam sousedství a maticová reprezentace grafu

⚡ Chytré shrnutí

Seznam sousedství a maticová reprezentace grafu ukládají vrcholy a hrany do paměti, což umožňuje algoritmům procházet sítěmi. Seznam sousedství používá propojené seznamy na vrchol, zatímco matice sousedství používá čtvercovou dvourozměrnou mřížku.

  • 📐 Seznam sousedství: Pole V propojených seznamů, kde každý seznam na indexu i uchovává každý vrchol sousedící s vrcholem i, což dává O(V + E) paměti.
  • 🗺️ Matice sousednosti: Dvourozměrné pole AV × V, kde matice[i][j] obsahuje váhu hrany nebo 1, pokud mezi vrcholem i a vrcholem j existuje hrana.
  • Rychlost vyhledávání: Matice sousednosti odpovídá na otázku „existuje hrana mezi i a j?“ v čase O(1), zatímco seznam sousednosti potřebuje k prohledání seznamu sousedů čas O(stupňů).
  • 💾 Paměť: Matice sousednosti vždy spotřebuje O(V²) paměti, a to i pro řídké grafy, zatímco seznam sousednosti se škáluje podle skutečného počtu hran.
  • 🔍 Nejlepší fit: Pro husté grafy s častými dotazy na hrany zvolte matici sousednosti a pro řídké grafy a úlohy s vysokou mírou procházení dat zvolte seznam sousednosti.
  • 🛠️ Aplikace: Obě reprezentace podporují BFS, DFS, Dijkstrovu analýzu, PageRank, směrování silničních sítí a pipeline grafových neuronových sítí používaných v systémech umělé inteligence.

Seznam sousedství a maticová reprezentace grafu

I když vypadají jinak, všechny typy grafů lze reprezentovat podobným způsobem. Obecně existují dva typy grafové reprezentace:

  1. Matice sousedství
  2. Seznam sousedů

Seznam sousedů

Seznam sousedních bodů se skládá z propojených seznamů. Každý vrchol je považován za index pole a každý prvek představuje propojený seznam. Tyto propojené seznamy obsahují vrcholy, které sdílejí hranu s indexovým vrcholem.

Zde je příklad seznamu sousedství:

Seznam sousedů

Nechť graf obsahuje V vrcholů a E hran. Prostorová složitost seznamu sousedností je O(V + E), který se škáluje s počtem reálných hran, nikoli s každým možným párem vrcholů.

V nejhorším případě se prostorová složitost stává O(V²) pokud je daný graf úplný graf, protože každý vrchol se pak napojuje na každý další vrchol.

Matice sousedství

Matice sousednosti se skládá z 2D pole. Pro graf s V vrcholy bude velikost matice V × V.

Říci matrix[i][j] = 5To znamená, že mezi uzlem i a uzlem j existuje hrana, kde je váha 5.

Podívejme se na následující graf a jeho matici sousednosti:

Matice sousedství

Postavili jsme 2D pole pomocí těchto kroků:

Krok 1) Vrchol A má přímou hranu s vrcholem B a váha je 5. Buňka v řádku A a sloupci B bude tedy vyplněna číslem 5. Zbytek buněk v řádku A bude vyplněn nulou.

Krok 2) Vrchol B má přímou hranu s vrcholem C a váha je 4. Buňka v řádku B a sloupci C bude tedy vyplněna 4. Zbývající buňky v řádku B budou vyplněny nulou, protože B nemá žádnou odchozí hranu k žádnému jinému uzlu.

Krok 3) Vrchol C nemá žádné přímé hrany s žádnými jinými vrcholy. Řádek C tedy bude vyplněn nulami.

Krok 4) Vrchol D má orientovanou hranu s A a C.

  • Buňka v řádku D a sloupci A bude mít hodnotu 7. Buňka v řádku D a sloupci C bude mít hodnotu 2.
  • Zbytek buněk v řádku D bude vyplněn nulami.

Krok 5) Vrchol E má orientovanou hranu s B a D. Buňka v řádku E a sloupci B bude mít hodnotu 6. Buňka v řádku E a sloupci D bude mít hodnotu 3. Zbytek buněk v řádku E bude vyplněn nulami.

Zde je několik bodů, kterých si musíte všimnout:

  • Graf nemá žádné vlastní smyčky, když je primární diagonála matice sousednosti rovna 0.
  • Graf je orientovaný, pokud buňky v bodech (a, b) a (b, a) neobsahují stejnou hodnotu. Jinak je graf neorientovaný.
  • Graf je vážený, pokud je hodnota jakékoli buňky větší než 1.

Hlavním problémem matice sousednosti je, že vyžaduje druhou mocninu prostoru. I hrany, které neexistují, stále alokují buňky v paměti.

Například pokud máme graf se 100 uzly, pak je pro jeho uložení potřeba 10 000 buněk. RAMS menším počtem hran v grafu může být alokace tak velké paměti nehospodárná. Prostorová složitost s využitím matice sousednosti je tedy O(N²), kde N je počet uzlů v grafu.

Seznam sousedství vs. matice sousedství

Před výběrem reprezentace je užitečné porovnat oba modely vedle sebe napříč operacemi, které dominují v reálných grafových úlohách:

OperaváníMatice sousedstvíSeznam sousedů
Prostorová složitostO(V²)O(V + E)
Přidat vrcholO(V²)O (1)
Přidat hranuO (1)O (1)
Odstranění hranyO (1)O(E)
Zkontrolovat, zda hrana (i, j) existujeO (1)O (stupeň i)
Iterujte přes sousedy iO(V)O (stupeň i)
Nejlepší proHusté grafy, časté dotazy na hranyŘídké grafy, úlohy s vysokou mírou procházení

Stručně řečeno, matice sousednosti vítězí při vyhledávání hran v konstantním čase, zatímco seznam sousednosti vítězí v iteraci paměti a sousedů, a proto se algoritmy jako BFS, DFS a Dijkstra obvykle párují se seznamy sousednosti.

Výhody a nevýhody grafové reprezentace

Každá reprezentace má své vlastní nevýhody. Znalost silných a slabých stránek obou modelů vám pomůže vybrat ten správný pro problém, který řešíte.

Výhody matice sousednosti:

  • Dotazy na existenci hran mezi libovolnou dvojicí vrcholů v konstantním čase O(1).
  • Fixní indexování usnadňuje implementaci maticových algoritmů, jako je Floyd-Warshall a tranzitivní uzávěr.
  • Vážené hrany se přirozeně vejdou do jedné buňky matice.

Nevýhody matice sousednosti:

  • Pokud je graf řídký, plýtvá se pamětí O(V²).
  • Přidání nového vrcholu vyžaduje změnu velikosti celé matice.
  • Iterování přes sousedy jednoho vrcholu trvá O(V), i když má vrchol jen několik hran.

Výhody seznamu sousedství:

  • Používá pouze O(V + E) paměti, což se blíží skutečnému počtu hran v řídkých grafech.
  • Přidání nového vrcholu nebo hrany je O(1).
  • Traverzální algoritmy jako BFS a DFS iterují sousedy v O(stupni), což dává celkovou dobu běhu O(V + E).

Nevýhody seznamu sousedství:

  • Kontrola, zda existuje specifická hrana, trvá O(stupeň) místo O(1).
  • Lokalita mezipaměti je slabší, protože propojené seznamy jsou rozptýleny po paměti.
  • Vážené hrany potřebují doprovodné pole nebo seznam párů, což mírně komplikuje datovou strukturu.

Kdy použít seznam sousedností vs. matici sousedností

Volba reprezentace závisí na hustotě grafu a operacích, které nejčastěji provádíte. Pro výběr správné struktury použijte tohoto rychlého průvodce:

  • Preferujte matici sousednosti když je graf hustý (E je blízké V²), když se hrany zřídka mění a když se váš algoritmus mnohokrát ptá „existuje hrana mezi i a j?“.
  • Preferovat seznam sousedství když je graf řídký (E je mnohem menší než V²), když množina vrcholů nebo hran roste během provádění a když procházíte grafem pomocí BFS, DFS nebo Dijkstrův algoritmus pro nalezení nejkratší cesty.
  • Preferujte smíšený model (seznam sousedností plus hašovací sada hran), když potřebujete jak rychlou iteraci sousedů, tak i dotazy na hrany O(1), za cenu dodatečné paměti.

Moderní knihovny grafů, jako jsou NetworkX a igraph, standardně používají seznamy sousedností, protože většina reálných grafů – sociální sítě, mapy silnic, webové stránky, závislosti balíčků – je řídká a vyžaduje velké množství procházení.

Nejčastější dotazy

Seznam sousedství je pole V propojených seznamů, kde každý seznam na indexu i uchovává každý vrchol sousedící s vrcholem i. Využití paměti je O(V + E), což vyhovuje řídkým grafům a algoritmům procházení, jako jsou BFS a DFS.

Matice sousednosti je dvourozměrné pole o rozměrech V × V, kde matice[i][j] obsahuje váhu hrany nebo 1, pokud mezi vrcholem i a vrcholem j existuje hrana. Vyhledávání hran je O(1), ale paměť je vždy O(V²).

Matice sousednosti odpovídá na dotazy na existenci hran za O(1). Seznam sousednosti iteruje sousedy za O(stupeň), což je rychlejší pro algoritmy procházení, jako jsou BFS, DFS a Dijkstra. Nejlepší volba závisí na operacích, které dominují vaší pracovní zátěži.

Seznam sousedství použijte, když je graf řídký, když se vrcholy a hrany během provádění mění a když algoritmus často prochází sousedy. Tento profil splňují sociální sítě, mapy silnic a grafy webových stránek.

Matici sousednosti použijte, když je graf hustý, když je množina vrcholů pevná a když algoritmus opakovaně dotazuje stejnou hranu. Floyd-Warshallův uzávěr a tranzitivní uzávěr fungují přirozeně na maticích sousednosti.

Ano. U orientovaných grafů není matice symetrická a seznam ukládá pouze odchozí sousedy. U vážených grafů buňka matice uchovává váhu, zatímco seznam ukládá dvojice soused a váha.

Grafové neuronové sítě dodávají matice sousednosti nebo řídké tenzory hran do vrstev strojového učení pro detekci podvodů, predikci vlastností molekul a doporučovací systémy. Znalostní grafy se také spoléhají na kódování seznamů sousednosti pro umělou inteligenci rozšířenou o vyhledávání.

Ano. GitHub Copilot a ChatGPT generují seznam sousedností a maticový standard pro Python, C++, a JavaVývojáři stále potřebují ověřovat okrajové případy, jako jsou duplicitní hrany, smyčky po sobě a správné zpracování orientovaných nebo vážených grafů.

Shrňte tento příspěvek takto: