Popis susjedstva i matrična reprezentacija grafa

⚡ Pametni sažetak

Popis susjednosti i matrični prikaz grafa pohranjuju vrhove i bridove u memoriju, omogućujući algoritmima da prolaze kroz mreže. Popis susjednosti koristi povezane popise po vrhu, dok matrica susjednosti koristi kvadratnu dvodimenzionalnu mrežu.

  • 📐 Popis susjedstva: Niz od V povezanih lista gdje svaka lista na indeksu i pohranjuje svaki vrh susjedni vrhu i, dajući O(V + E) memorije.
  • 🗺️ Matrica susjednosti: AV × V dvodimenzionalni niz gdje matrica[i][j] sadrži težinu brida ili 1 kada brid postoji između vrha i i vrha j.
  • Brzina pretraživanja: Matrica susjednosti odgovara na pitanje „postoji li rub između i i j?“ u vremenu O(1), dok listi susjednosti treba vremena O(stupnjeva) za skeniranje liste susjeda.
  • 💾 Memorija: Matrica susjednosti uvijek troši O(V²) memorije čak i za rijetke grafove, dok se lista susjednosti skalira sa stvarnim brojem bridova.
  • 🔍 Najbolje odgovara: Odaberite matricu susjednosti za guste grafove s čestim upitima na rubove i listu susjednosti za rijetke grafove i opterećenja s velikim obilaženjem.
  • 🛠️ Primjena: Oba prikaza pokreću BFS, DFS, Dijkstru, PageRank, usmjeravanje cestovne mreže i cjevovode grafovske neuronske mreže koji se koriste u AI sustavima.

Popis susjedstva i matrična reprezentacija grafa

Iako izgledaju drugačije, svi vrste grafova može se predstaviti na sličan način. Općenito postoje dvije vrste grafičkog prikaza:

  1. Matrica susjedstva
  2. Popis susjedstva

Popis susjedstva

Lista susjednosti sastoji se od povezanih lista. Svaki vrh se smatra indeksom polja, a svaki element predstavlja povezanu listu. Ove povezane liste sadrže vrhove koji dijele rub s indeksnim vrhom.

Evo primjera liste susjednosti:

Popis susjedstva

Neka graf sadrži V broj vrhova i E broj bridova. Prostorna složenost liste susjednosti je O(V + E), koji se skalira s brojem stvarnih bridova, a ne sa svakim mogućim parom vrhova.

Složenost prostora u najgorem slučaju postaje O(V²) ako je zadani graf potpun graf, budući da se svaki vrh tada povezuje sa svakim drugim vrhom.

Matrica susjedstva

Matrica susjednosti sastoji se od 2D polja. Za graf s V vrhova, veličina matrice bit će V × V.

Reći matrix[i][j] = 5To znači da postoji rub između čvora i i čvora j gdje je težina 5.

Pogledajmo sljedeći graf i njegovu matricu susjednosti:

Matrica susjedstva

Izgradili smo 2D niz koristeći ove korake:

Korak 1) Vrh A ima izravnu granu s vrhom B, a težina je 5. Dakle, ćelija u retku A i stupcu B bit će ispunjena s 5. Ostale ćelije u retku A bit će ispunjene s nulom.

Korak 2) Vrh B ima izravni rub s C, a težina je 4. Dakle, ćelija u retku B i stupcu C bit će ispunjena s 4. Preostale ćelije u retku B bit će ispunjene s nulom, budući da B nema izlaznog ruba prema bilo kojem drugom čvoru.

Korak 3) Vrh C nema izravnih rubova s ​​drugim vrhovima. Dakle, redak C bit će popunjen nulama.

Korak 4) Vrh D ima usmjereni brid s A i C.

  • Ćelija u retku D i stupcu A imat će vrijednost 7. Ćelija u retku D i stupcu C imat će vrijednost 2.
  • Ostatak ćelija u retku D bit će ispunjen nulama.

Korak 5) Vrh E ima usmjereni brid s B i D. Ćelija u retku E i stupcu B imat će vrijednost 6. Ćelija u retku E i stupcu D imat će vrijednost 3. Ostale ćelije u retku E bit će popunjene nulama.

Evo nekoliko točaka koje treba primijetiti:

  • Graf nema vlastitih petlji kada je primarna dijagonala matrice susjednosti jednaka 0.
  • Graf je usmjereni graf ako ćelije u točkama (a, b) i (b, a) ne sadrže istu vrijednost. U suprotnom, graf je neusmjeren.
  • Graf je ponderirani graf ako je vrijednost bilo koje ćelije veća od 1.

Glavni problem s matricom susjednosti je taj što zahtijeva kvadratni prostor. Čak i rubovi koji ne postoje i dalje alociraju ćelije u memoriji.

Na primjer, ako imamo graf sa 100 čvorova, tada je potrebno 10 000 ćelija za njegovo pohranjivanje. RAMS manjim brojem bridova u grafu, alokacija tako velike memorije može biti rasipna. Stoga je prostorna složenost korištenjem matrice susjednosti O(N²), gdje je N broj čvorova u grafu.

Popis susjednosti u odnosu na matricu susjednosti

Prije odabira reprezentacije, korisno je usporediti oba modela jedan pored drugog kroz operacije koje dominiraju stvarnim opterećenjima grafova:

OperaANJEMatrica susjedstvaPopis susjedstva
Složenost prostoraO(V²)O(V + E)
Dodaj vrhO(V²)O (1)
Dodajte rubO (1)O (1)
Uklonite rubO (1)O(E)
Provjeri postoji li rub (i, j)O (1)O (stupanj i)
Iteriraj preko susjeda od iO(V)O (stupanj i)
Najbolje zaGusti grafovi, česti upiti o rubovimaRijetki grafovi, zadaci s puno prolaska kroz objekte

Ukratko, matrica susjednosti pobjeđuje kod pretraživanja rubova u konstantnom vremenu, dok lista susjednosti pobjeđuje kod iteracije memorije i susjeda, zbog čega se algoritmi poput BFS-a, DFS-a i Dijkstre obično uparuju s listama susjednosti.

Prednosti i nedostaci grafičkog prikaza

Svaka reprezentacija nosi svoje nedostatke. Poznavanje snaga i slabosti oba modela pomaže vam da odaberete pravi za problem koji rješavate.

Prednosti matrice susjednosti:

  • Upiti o postojanju bridova u konstantnom vremenu O(1) između bilo kojeg para vrhova.
  • Fiksno indeksiranje olakšava implementaciju algoritama temeljenih na matricama poput Floyd-Warshallovog algoritma i tranzitivnog zatvaranja.
  • Ponderirani rubovi prirodno se uklapaju u jednu matričnu ćeliju.

Nedostaci matrice susjednosti:

  • Troši O(V²) memorije kada je graf rijedak.
  • Dodavanje novog vrha zahtijeva promjenu veličine cijele matrice.
  • Iteriranje preko susjeda jednog vrha traje O(V) čak i kada vrh ima samo nekoliko bridova.

Prednosti liste susjednosti:

  • Koristi samo O(V + E) memorije, što je blizu stvarnom broju rubova u rijetkim grafovima.
  • Dodavanje novog vrha ili brida je O(1).
  • Algoritmi za prolazak kroz sustav poput BFS-a i DFS-a iteriraju susjede u O(stupnju), dajući ukupno vrijeme izvođenja O(V + E).

Nedostaci liste susjednosti:

  • Provjera postojanja određenog ruba traje O(stupnjeva) umjesto O(1).
  • Lokalnost predmemorije je slabija jer su povezane liste raspršene po memoriji.
  • Ponderirani rubovi trebaju prateće polje ili popis parova, što malo komplicira strukturu podataka.

Kada koristiti listu susjednosti u odnosu na matricu susjednosti

Izbor reprezentacije ovisi o gustoći grafa i operacijama koje najčešće izvodite. Koristite ovaj kratki vodič za odabir prave strukture:

  • Preferirajte matricu susjednosti kada je graf gust (E je blizu V²), kada se rubovi rijetko mijenjaju i kada vaš algoritam više puta pita „postoji li rub između i i j?“.
  • Preferiraj popis susjedstva kada je graf rijedak (E je puno manji od V²), kada skup vrhova ili bridova raste tijekom izvršavanja i kada prolazite kroz graf s BFS-om, DFS-om ili Dijkstrin algoritam za najkraći put.
  • Preferirajte miješani model (lista susjednosti plus hash skup bridova) kada vam je potrebna i brza iteracija susjeda i O(1) upiti bridova, nauštrb dodatne memorije.

Moderne biblioteke grafova poput NetworkX-a i igrapha prema zadanim postavkama koriste liste susjednosti jer je većina grafova iz stvarnog svijeta - društvene mreže, cestovne karte, web stranice, ovisnosti paketa - rijetka i opterećena prolaskom kroz njih.

Pitanja i odgovori

Lista susjednosti je niz od V povezanih lista gdje svaka lista na indeksu i pohranjuje svaki vrh susjedni vrhu i. Potrošnja memorije je O(V + E), što odgovara rijetkim grafovima i algoritmima za prolazak kroz njih kao što su BFS i DFS.

Matrica susjednosti je dvodimenzionalni niz dimenzija V × V gdje matrica[i][j] sadrži težinu brida ili 1 ako brid postoji između vrha i i vrha j. Pretraživanje brida je O(1), ali memorija je uvijek O(V²).

Matrica susjednosti odgovara na upite o postojanju rubova u O(1). Lista susjednosti iterira susjede u O(stupanj), što je brže za algoritme prolaska kao što su BFS, DFS i Dijkstra. Najbolji izbor ovisi o operacijama koje dominiraju vašim radnim opterećenjem.

Koristite listu susjednosti kada je graf rijedak, kada se vrhovi i bridovi mijenjaju tijekom izvršavanja i kada algoritam često prelazi preko susjeda. Društvene mreže, cestovne karte i grafovi web stranica odgovaraju ovom profilu.

Koristite matricu susjednosti kada je graf gust, kada je skup vrhova fiksan i kada algoritam više puta ispituje isti brid. Floyd-Warshall i tranzitivno zatvaranje prirodno funkcioniraju na matricama susjednosti.

Da. Za usmjerene grafove matrica nije simetrična i popis pohranjuje samo izlazne susjede. Za ponderirane grafove ćelija matrice sadrži težinu, dok popis pohranjuje parove susjeda i težine.

Grafovske neuronske mreže ubacuju matrice susjednosti ili tenzore rijetkih rubova u slojeve strojnog učenja za otkrivanje prijevara, predviđanje svojstava molekula i sustave preporuka. Grafovi znanja također se oslanjaju na kodiranja popisa susjednosti za umjetnu inteligenciju proširenu pronalaženjem.

Da. GitHub Copilot i ChatGPT generiraju popis susjednosti i matričnu predložnu ploču za Python, C++i JavaRazvojni programeri i dalje trebaju provjeriti rubne slučajeve kao što su duplicirani rubovi, samopetlje i ispravno rukovanje usmjerenim ili ponderiranim grafovima.

Sažmite ovu objavu uz: