Graafin vierekkäisyysluettelo ja matriisiesitys

⚡ Älykäs yhteenveto

Graafin vierekkäisyyslista ja matriisiesitys tallentavat solmut ja kaaret muistiin, jolloin algoritmit voivat kulkea verkkojen läpi. Vierekkäisyyslista käyttää linkitettyjä listoja solmukohtaisesti, kun taas vierekkäisyysmatriisi käyttää neliömäistä kaksiulotteista ruudukkoa.

  • 📐 Vierekkäisyysluettelo: V linkitettyjen listojen taulukko, jossa jokainen indeksin i lista tallentaa kaikki solmun i viereiset solmut, jolloin muistia on O(V + E).
  • 🗺️ Vierekkäisyysmatriisi: AV × V kaksiulotteinen taulukko, jossa matriisi[i][j] sisältää kaaren painon tai 1, kun pisteiden i ja j välillä on kaari.
  • Hakunopeus: Vierekkäisyysmatriisi vastaa kysymykseen ”onko i:n ja j:n välillä reunaa?” ajassa O(1), kun taas vierekkäisyyslista tarvitsee O (aste) aikaa naapurilistan läpikäymiseen.
  • 💾 Muisti: Vierekkäisyysmatriisi kuluttaa aina O(V²) muistia jopa harvoilla graafeilla, kun taas vierekkäisyyslista skaalautuu todellisen kaarien lukumäärän mukaan.
  • 🔍 Parhaiten sopiva: Valitse vierekkäisyysmatriisi tiheille graafeille, joissa on usein reunakyselyitä, ja vierekkäisyyslista harvoille graafeille ja läpikulkua vaativille työkuormille.
  • 🛠️ Sovellukset: Molemmat representaatiot tukevat BFS:ää, DFS:ää, Dijkstraa, PageRankia, tieverkon reititystä ja graafineuraaliverkkojen putkistoja, joita käytetään tekoälyjärjestelmissä.

Graafin vierekkäisyysluettelo ja matriisiesitys

Vaikka ne näyttävätkin erilaisilta, kaikki kaavioiden tyypit voidaan esittää samalla tavalla. Graafiesitystyyppejä on yleensä kaksi:

  1. Viereisyysmatriisi
  2. Adjacency-luettelo

Adjacency-luettelo

Vierekkäisyyslista koostuu linkitetyistä listoista. Jokainen solmu on taulukkoindeksi, ja jokainen alkio edustaa linkitettyä listaa. Nämä linkitetyt listat sisältävät solmut, joilla on yhteinen kaari indeksin solmun kanssa.

Tässä on esimerkki vierekkäisyysluettelosta:

Adjacency-luettelo

Olkoon graafissa V lukumäärä solmuja ja E lukumäärä kaaria. Vierekkäisyyslistan avaruusvaativuus on O(V + E), joka skaalautuu todellisten reunojen lukumäärän mukaan pikemminkin kuin kaikkien mahdollisten kärkiparien mukaan.

Pahimmassa tapauksessa avaruuskompleksisuus muuttuu O(V²) jos annettu graafi on täydellinen graafi, koska jokainen kärki yhdistyy sitten jokaiseen muuhun kärkeen.

Viereisyysmatriisi

Vierekkäisyysmatriisi koostuu 2D-taulukosta. Jos graafissa on V solmua, matriisin koko on V × V.

Sanoa matrix[i][j] = 5Se tarkoittaa, että solmujen i ja j välillä on reuna, jossa paino on 5.

Tarkastellaan seuraavaa graafia ja sen vierekkäisyysmatriisia:

Viereisyysmatriisi

Me rakensimme 2D-taulukko käyttämällä näitä vaiheita:

Vaihe 1) Pisteellä A on suora reuna pisteen B kanssa, ja paino on 5. Niinpä rivin A ja sarakkeen B solu täytetään luvulla 5. Loput rivin A solut täytetään nollalla.

Vaihe 2) Pisteellä B on suora reuna solmun C kanssa, ja paino on 4. Joten rivin B ja sarakkeen C solu täytetään luvulla 4. Rivin B loput solut täytetään nollalla, koska solmulla B ei ole lähtevää reunaa mihinkään muuhun solmuun.

Vaihe 3) Pisteellä C ei ole suoria reunoja minkään muun pisteen kanssa. Joten rivi C täytetään nollilla.

Vaihe 4) Pisteellä D on suunnattu kaari A:n ja C:n kanssa.

  • Rivin D ja sarakkeen A solun arvo on 7. Rivin D ja sarakkeen C solun arvo on 2.
  • Loput rivin D solut täytetään nollilla.

Vaihe 5) Pisteellä E on suunnattu kaari pisteiden B ja D kanssa. Rivin E ja sarakkeen B solun arvo on 6. Rivin E ja sarakkeen D solun arvo on 3. Loput rivin E solut täytetään nollilla.

Tässä on joitain huomioitavia kohtia:

  • Graafi ei solmi itseään silmukoilla, kun vierekkäisyysmatriisin päädiagonaali on 0.
  • Graafi on suunnattu graafi, jos solujen (a, b) ja (b, a) arvot eivät ole samat. Muussa tapauksessa graafi on suuntaamaton.
  • Graafi on painotettu graafi, jos jonkin solun arvo on suurempi kuin 1.

Vierekkäisyysmatriisin suurin ongelma on, että se vaatii neliöityneen tilan. Jopa olemattomat kaaret varaavat silti soluja muistissa.

Esimerkiksi jos meillä on graafi, jossa on 100 solmua, niin sen tallentamiseen tarvitaan 10 000 solua. RAMKoska graafissa on vähemmän kaaria, niin suuren muistin varaaminen voi olla turhaa. Joten vierekkäisyysmatriisia käytettäessä avaruuskompleksisuus on O(N²), jossa N on solmujen lukumäärä graafissa.

Vierekkäisyysluettelo vs. vierekkäisyysmatriisi

Ennen esityksen valitsemista on hyödyllistä vertailla molempia malleja rinnakkain niiden operaatioiden välillä, jotka hallitsevat todellisia graafikuormia:

OperaTUKSENViereisyysmatriisiAdjacency-luettelo
Avaruuden monimutkaisuusO(V²)O(V + E)
Lisää kärkipisteO(V²)O (1)
Lisää reunaO (1)O (1)
Poista reunaO (1)O(E)
Tarkista, onko reunaa (i, j) olemassaO (1)O (i:n aste)
Iteroi i:n naapureiden yliO (V)O (i:n aste)
ParastaTiheät graafit, usein esiintyvät reunakyselytHarvat graafit, läpikulkupainotteiset tehtävät

Lyhyesti sanottuna vierekkäisyysmatriisi voittaa vakioaikaisissa reunahauissa, kun taas vierekkäisyyslista voittaa muistissa ja naapuriteroinnissa, minkä vuoksi algoritmit, kuten BFS, DFS ja Dijkstra, yleensä käyttävät pareja vierekkäisyyslistojen kanssa.

Graafiesityksen edut ja haitat

Jokaisella esitystavalla on omat kompromissinsa. Molempien mallien vahvuuksien ja heikkouksien tunteminen auttaa sinua valitsemaan oikean mallin ratkaisemaasi ongelmaan.

Vierekkäisyysmatriisin edut:

  • Vakioaikaiset O(1) reunan olemassaolokyselyt minkä tahansa solmuparin välillä.
  • Kiinteä indeksointi tekee matriisipohjaisten algoritmien, kuten Floyd-Warshallin ja transitiivisen sulkeuman, toteuttamisesta helppoa.
  • Painotetut reunat sopivat luonnollisesti yhteen matriisisoluun.

Vierekkäisyysmatriisin haitat:

  • Tuhlaa O(V²) muistia, kun graafi on harva.
  • Uuden kärkipisteen lisääminen vaatii koko matriisin koon muuttamisen.
  • Yhden solmun naapureiden yli iterointi vaatii O(V):n, vaikka solmulla olisi vain muutama kaari.

Vierekkäisyyslistan edut:

  • Käyttää vain O(V + E)-muistia, joka on lähellä todellista kaarien määrää harvoissa graafeissa.
  • Uuden kärkipisteen tai kaaren lisääminen on O(1).
  • Läpikulkualgoritmit, kuten BFS ja DFS, iteroivat naapureita O(asteessa), jolloin kokonaissuoritusaika on O(V + E).

Vierekkäisyyslistan haitat:

  • Tietyn reunan olemassaolon tarkistaminen vie O (aste) aikaa O(1) sijaan.
  • Välimuistin lokaalius on heikompi, koska linkitetyt listat ovat hajallaan muistissa.
  • Painotetut reunat tarvitsevat kumppanikentän tai pariluettelon, mikä hieman monimutkaistaa tietorakennetta.

Milloin käyttää vierekkäisyysluetteloa vs. vierekkäisyysmatriisia

Esitystavan valinta riippuu graafin tiheydestä ja useimmin suoritettavista operaatioista. Käytä tätä pikaopasta valitaksesi oikean rakenteen:

  • Suosi vierekkäisyysmatriisia kun graafi on tiheä (E on lähellä V²:tä), kun kaaret muuttuvat harvoin ja kun algoritmisi kysyy useita kertoja "onko i:n ja j:n välillä kaaria?".
  • Suosi vierekkäisyyttä kun graafi on harva (E on paljon pienempi kuin V²), kun solmu- tai kaarijoukko kasvaa suorituksen aikana ja kun graafia käydään läpi BFS:llä, DFS:llä tai Dijkstran lyhimmän polun algoritmi.
  • Mieluummin sekamalli (vieruslista plus hajautusjoukko kaaria), kun tarvitset sekä nopeaa naapurikyselyä että O(1)-reunakyselyitä lisämuistin kustannuksella.

Nykyaikaiset graafikirjastot, kuten NetworkX ja igraph, käyttävät oletusarvoisesti vierekkäisyyslistoja, koska useimmat reaalimaailman graafit – sosiaaliset verkostot, tiekartat, verkkosivut ja pakettiriippuvuudet – ovat harvassa ja läpikulkupainotteisia.

UKK

Vierekkäisyyslista on V linkitettyjen listojen taulukko, jossa jokainen indeksin i lista tallentaa kaikki solmun i viereiset solmut. Muistin käyttö on O(V + E), mikä sopii harvoille graafeille ja läpikulkualgoritmeille, kuten BFS ja DFS.

Vierekkäisyysmatriisi on kaksiulotteinen V × V -taulukko, jossa matriisi[i][j] sisältää kaaren painon tai arvon 1, jos pisteiden i ja j välillä on kaari. Kaaren haku on O(1), mutta muisti on aina O(V²).

Vierekkäisyysmatriisi vastaa reunan olemassaoloa koskeviin kyselyihin O(1):ssä. Vierekkäisyyslista iteroi naapureita O(asteessa), mikä on nopeampaa läpikulkualgoritmeille, kuten BFS, DFS ja Dijkstra. Paras valinta riippuu työmäärääsi hallitsevista operaatioista.

Käytä vierekkäisyyslistaa, kun graafi on harva, kun solmut ja kaaret muuttuvat suorituksen aikana ja kun algoritmi kulkee naapureiden läpi usein. Sosiaaliset verkostot, tiekartat ja verkkosivugraafit sopivat kaikki tähän profiiliin.

Käytä vierekkäisyysmatriisia, kun graafi on tiheä, kun solmujoukko on kiinteä ja kun algoritmi kyselee samaa kaarea toistuvasti. Sekä Floyd-Warshallin että transitiivisen sulkeuman menetelmä toimivat luonnollisesti vierekkäisyysmatriiseille.

Kyllä. Suunnatuissa graafeissa matriisi ei ole symmetrinen ja lista tallentaa vain lähtevät naapurit. Painotetuissa graafeissa matriisisolu sisältää painon, kun taas lista tallentaa naapuri- ja painoparit.

Graafineuraaliverkot syöttävät vierekkäisyysmatriiseja tai harvoja reunatensoreita koneoppimiskerroksiin petosten havaitsemista, molekyylien ominaisuuksien ennustamista ja suositusjärjestelmiä varten. Tietograafit käyttävät myös vierekkäisyysluettelokoodauksia haulla laajennetussa tekoälyssä.

Kyllä. GitHub Copilot ja ChatGPT luovat vierekkäisyysluettelon ja matriisin pohjapiirroksen kohteelle Python, C++ja JavaKehittäjien on edelleen tarkistettava reunatapaukset, kuten kaksoisreunat, itseään rikkovat silmukat ja suunnattujen tai painotettujen graafien oikea käsittely.

Tiivistä tämä viesti seuraavasti: