Graafiku külgnemisloend ja maatriksesitus

⚡ Nutikas kokkuvõte

Graafi külgnevusloend ja maatriksi esitus salvestavad tippe ja servi mällu, võimaldades algoritmidel võrgustikke läbida. Külgnevusloend kasutab tipu kohta lingitud loendeid, samas kui külgnevusmaatriks kasutab ruudukujulist kahemõõtmelist ruudustikku.

  • 📐 Naabruskondade loend: V lingitud loendite massiiv, kus iga i-nda indeksi juures olev loend salvestab kõik tipuga i külgnevad tipud, andes O(V + E) mälu.
  • 🗺️ Kõrvaloleku maatriks: AV × V kahemõõtmeline massiiv, kus maatriks[i][j] hoiab serva kaalu või 1, kui tippude i ja j vahel asub serv.
  • Otsingu kiirus: Kõrvusmaatriks vastab küsimusele „kas i ja j vahel on serv?” O(1) ajaga, samas kui külgnevusloend vajab naaberloendi läbivaatamiseks O kraadi aega.
  • 💾 Mälu: Kõrvusmaatriks tarbib alati O(V²) mälu isegi hõredate graafide korral, samas kui külgnevusloend skaleerub tegeliku servade arvuga.
  • 🔍 Parim sobivus: Valige külgnevusmaatriks tihedate graafikute jaoks, millel on sagedased servapäringud, ja külgnevusloend hõredate graafikute ja suure läbimiskoormusega graafikute jaoks.
  • 🛠️ Rakendused: Mõlemad esitused toetavad BFS-i, DFS-i, Dijkstra, PageRanki, teedevõrgu marsruutimist ja graafilise närvivõrgu torujuhtmeid, mida kasutatakse tehisintellekti süsteemides.

Graafiku külgnemisloend ja maatriksesitus

Kuigi nad näevad välja erinevad, kõik graafikute tüübid saab esitada sarnasel viisil. Üldiselt on kahte tüüpi graafilist esitust:

  1. Külgnevusmaatriks
  2. Adjacency nimekiri

Adjacency nimekiri

Kõrvalasuvusloend koosneb lingitud loenditest. Iga tippu peetakse massiivi indeksiks ja iga element esindab lingitud loendit. Need lingitud loendid sisaldavad tippe, mis jagavad serva indekstipuga.

Siin on näide külgnevusloendist:

Adjacency nimekiri

Olgu graaf V arvu tippe ja E arvu servi. Kõrvutiloendi ruumikeerukus on O(V + E), mis skaleerub pigem reaalsete servade arvuga kui iga võimaliku tippude paariga.

Halvimal juhul muutub ruumi keerukus O(V²) kui antud graaf on täielik graaf, kuna iga tipp ühendub siis iga teise tipuga.

Külgnevusmaatriks

Külgnevusmaatriks koosneb kahemõõtmelisest massiivist. V tipuga graafi korral on maatriksi suurus V × V.

Ütleme matrix[i][j] = 5See tähendab, et sõlmede i ja j vahel on serv, kus kaal on 5.

Vaatleme järgmist graafikut ja selle külgnevusmaatriksit:

Külgnevusmaatriks

Me ehitasime 2D massiiv kasutades neid samme:

Step 1) Tipul A on B-ga otse serv ja tippude kaal on 5. Seega täidetakse rea A ja veeru B lahter arvuga 5. Ülejäänud rea A lahtrid täidetakse nulliga.

Step 2) Tipul B on C-ga otsene serv ja kaal on 4. Seega täidetakse rea B ja veeru C lahter arvuga 4. Ülejäänud rea B lahtrid täidetakse nulliga, kuna tipul B ei ole ühegi teise sõlmega väljuvat serva.

Step 3) Tipul C ei ole otsesid servi ühegi teise tipuga. Seega täidetakse rida C nullidega.

Step 4) Tipul D on suunatud serv A ja C-ga.

  • Rea D ja veeru A lahtri väärtus on 7. Rea D ja veeru C lahtri väärtus on 2.
  • Ülejäänud rea D lahtrid täidetakse nullidega.

Step 5) Tipul E on suunatud serv tippudega B ja D. Rea E ja veeru B lahtri väärtus on 6. Rea E ja veeru D lahtri väärtus on 3. Ülejäänud rea E lahtrid täidetakse nullidega.

Siin on mõned punktid, mida tähele panna:

  • Graafil ei ole isesilmuseid, kui külgnevusmaatriksi primaardiagonaal on 0.
  • Graafik on suunatud graaf, kui lahtrid punktides (a, b) ja (b, a) ei oma sama väärtust. Vastasel juhul on graaf suunamata.
  • Graafik on kaalutud graafik, kui mis tahes lahtri väärtus on suurem kui 1.

Kõrvusmaatriksi peamine probleem on see, et see nõuab ruutruumi. Isegi servad, mida pole olemas, eraldavad ikkagi mälus lahtreid.

Näiteks kui meil on 100 sõlmega graaf, siis on selle salvestamiseks vaja 10 000 lahtrit. RAMKuna graafikul on vähem servi, võib nii suure mälumahu eraldamine olla raiskav. Seega on külgnevusmaatriksi abil arvutatud ruumi keerukus järgmine: O(N²), kus N on graafiku sõlmede arv.

Kõrvalkohtade loend vs külgnevusmaatriks

Enne esituse valimist on kasulik võrrelda mõlemat mudelit kõrvuti operatsioonide lõikes, mis domineerivad reaalse graafi töökoormuste puhul:

OperamineKülgnevusmaatriksAdjacency nimekiri
Ruumi keerukusO(V²)O(V + E)
Lisa tippO(V²)O (1)
Lisa servO (1)O (1)
Eemalda servO (1)O(E)
Kontrolli, kas serv (i, j) eksisteeribO (1)O (i aste)
Itereeri i naabrite üleO(V)O (i aste)
Parim onTihedad graafikud, sagedased servapäringudHõredad graafid, läbimismahukad ülesanded

Lühidalt, külgnevusmaatriks võidab konstantse ajaga servaotsingutel, samas kui külgnevusloend võidab mälu ja naabri iteratsioonil, mistõttu algoritmid nagu BFS, DFS ja Dijkstra tavaliselt paaristuvad külgnevusloenditega.

Graafi esituse eelised ja puudused

Igal esitusviisil on omad kompromissid. Mõlema mudeli tugevate ja nõrkade külgede tundmine aitab teil valida lahendatava probleemi jaoks õige.

Kõrvalmaatriksi eelised:

  • Konstantse ajaga O(1) serva olemasolu päringud mis tahes tippude paari vahel.
  • Fikseeritud indekseerimine muudab maatriksipõhised algoritmid, näiteks Floyd-Warshalli ja transitiivse sulgemise, rakendamise lihtsaks.
  • Kaalutud servad sobivad loomulikult ühte maatriksi lahtrisse.

Kõrvalmaatriksi puudused:

  • Raiskab hõreda graafi korral O(V²) mälu.
  • Uue tipu lisamine nõuab kogu maatriksi suuruse muutmist.
  • Ühe tipu naabrite kohal itereerimine võtab O(V) isegi siis, kui tipul on ainult mõned servad.

Kõrvalkohtade loendi eelised:

  • Kasutab ainult O(V + E) mälu, mis on hõredate graafikute tegeliku servade arvu lähedal.
  • Uue tipu või serva lisamine on O(1).
  • Läbimisalgoritmid, näiteks BFS ja DFS, itereerivad naabreid O(kraadi) täpsusega, andes kokku O(V + E) jooksuaja.

Külgnevusloendi puudused:

  • Konkreetse serva olemasolu kontrollimine võtab O(kraadi) aja O(1) asemel.
  • Vahemälu lokaalsus on nõrgem, kuna lingitud loendid on mälus hajutatud.
  • Kaalutud servad vajavad kaasvälja või paaride loendit, mis muudab andmestruktuuri veidi keerulisemaks.

Millal kasutada külgnevusloendit vs külgnevusmaatriksit

Esituse valik sõltub graafiku tihedusest ja kõige sagedamini tehtavatest toimingutest. Õige struktuuri valimiseks kasutage seda kiirjuhendit:

  • Eelista külgnevusmaatriksit kui graaf on tihe (E on V² lähedal), kui servad harva muutuvad ja kui teie algoritm küsib mitu korda „kas i ja j vahel on serv?“.
  • Eelista külgnevate kohtade nimekirja kui graaf on hõre (E on palju väiksem kui V²), kui tippude või servade hulk täitmise ajal kasvab ja kui graafi läbitakse BFS-i, DFS-i või ... abil. Dijkstra lühima tee algoritm.
  • Eelista segamudelit (naaberloend pluss servade räsikomplekt), kui vajate nii kiiret naabrite iteratsiooni kui ka O(1) servapäringuid lisamälu hinnaga.

Kaasaegsed graafiteegid, näiteks NetworkX ja igraph, kasutavad vaikimisi külgnevusloendeid, kuna enamik reaalse maailma graafe – sotsiaalvõrgustikud, teekaardid, veebilehed, pakettide sõltuvused – on hõredad ja nõuavad palju läbimist.

KKK

Kõrvusloend on V lingitud loenditest koosnev massiiv, kus iga indeksiga i loend salvestab kõik tipu i-ga külgnevad tipud. Mälukasutus on O(V + E), mis sobib hõredate graafikute ja läbimisalgoritmide, näiteks BFS ja DFS, jaoks.

Kõrvalasuvusmaatriks on kahemõõtmeline V × V massiiv, kus maatriks[i][j] hoiab serva kaalu või 1, kui tippude i ja j vahel on serv. Serva otsing on O(1), kuid mälu on alati O(V²).

Kõrvalmaatriks vastab serva olemasolu päringutele O(1)-s. Kõrvalloend itereerib naabreid O(kraadi)s, mis on kiirem selliste läbimisalgoritmide puhul nagu BFS, DFS ja Dijkstra. Parim valik sõltub teie töökoormust domineerivatest operatsioonidest.

Kasutage külgnevusloendit, kui graaf on hõre, kui tipud ja servad täitmise ajal muutuvad ning kui algoritm läbib sageli naabreid. Sotsiaalvõrgustikud, teekaardid ja veebilehtede graafikud sobivad kõik selle profiiliga.

Kõrvusmaatriksit kasutatakse tiheda graafiga, fikseeritud tippude hulgaga ja algoritmi korduvate päringutega sama serva kohta. Floyd-Warshalli meetod ja transitiivne sulund toimivad külgnevusmaatriksite puhul loomulikult.

Jah. Suunatud graafide puhul ei ole maatriks sümmeetriline ja loend salvestab ainult väljuvaid naabreid. Kaalutud graafide puhul hoiab maatriksi lahter kaalu, samas kui loend salvestab naabri ja kaalu paarid.

Graafi närvivõrgud edastavad masinõppe kihtidesse külgnevusmaatrikseid või hõredate servade tensoreid pettuste tuvastamiseks, molekuli omaduste ennustamiseks ja soovitussüsteemideks. Teadmusgraafikud tuginevad otsingu abil laiendatud tehisintellekti jaoks samuti külgnevusloendi kodeeringutele.

Jah. GitHub Copilot ja ChatGPT genereerivad külgnevusloendi ja maatriksi malli Python, C++ja JavaArendajad peavad endiselt kontrollima servajuhtumeid, näiteks duplikaatservi, isetsüklilisi protsesse ja suunatud või kaalutud graafikute korrektset käsitlemist.

Võta see postitus kokku järgmiselt: