Adjacency List och Matrix Representation of Graph

⚡ Smart sammanfattning

Adjacenslista och matrisrepresentation av grafer lagrar noder och kanter i minnet, vilket gör att algoritmer kan korsa nätverk. Adjacenslista använder länkade listor per nod medan adjacensmatriser använder ett kvadratiskt tvådimensionellt rutnät.

  • 📐 Angränsande lista: En array av V länkade listor där varje lista vid index i lagrar varje noddel intill noddel i, vilket ger O(V + E) minne.
  • 🗺️ Närhetsmatris: AV × V tvådimensionell array där matris[i][j] har kantvikten eller 1 när en kant finns mellan hörn i och hörn j.
  • ⚡ Uppsökningshastighet: Adjacensmatrisen svarar på "finns det en kant mellan i och j?" i O(1)-tid, medan adjacenslistan behöver O(grader)tid för att skanna grannlistan.
  • 💾 Minne: Adjacensmatrisen förbrukar alltid O(V²) minne även för glesa grafer, medan en adjacenslista skalar med det faktiska kantantalet.
  • 🔍 Bästa passform: Välj adjacensmatrisen för täta grafer med frekventa kantfrågor och adjacenslistan för glesa grafer och traversal-tunga arbetsbelastningar.
  • 🛠️ Program: Båda representationerna driver BFS, DFS, Dijkstra, PageRank, vägnätverksrutning och Graph Neural Network-pipelines som används i AI-system.

Adjacency List och Matrix Representation of Graph

Även om de ser olika ut, alla typer av grafer kan representeras på ett liknande sätt. Det finns generellt två typer av grafrepresentation:

  1. Adjacency matris
  2. Angränsningslista

Angränsningslista

En adjacenslista består av länkade listor. Varje nodpunkt betraktas som ett arrayindex, och varje element representerar en länkad lista. Dessa länkade listor innehåller de noder som delar en kant med indexnoden.

Här är ett exempel på en angränsningslista:

Angränsningslista

Låt en graf innehålla V antal noder och E antal kanter. Rumskomplexiteten för adjacenslistan är O(V + E), som skalas med antalet reella kanter snarare än alla möjliga par av noder.

Värsta tänkbara rymdkomplexitet blir O(V²) om den givna grafen är en komplett graf, eftersom varje nodpunkt sedan ansluter till varje annan nodpunkt.

Adjacency matris

En adjacentmatris består av en 2D-matris. För en graf med V noder blir matrisens storlek V × V.

Säga matrix[i][j] = 5Det betyder att det finns en kant mellan nod i och nod j där vikten är 5.

Låt oss titta på följande graf och dess adjacentmatris:

Adjacency matris

Vi byggde 2D-array med dessa steg:

Steg 1) Punkt A har en rak kant med B, och vikten är 5. Så cellen i rad A och kolumn B kommer att fyllas med 5. Resten av cellerna i rad A kommer att fyllas med noll.

Steg 2) Nod B har en rak kant med C, och vikten är 4. Så cellen i rad B och kolumn C kommer att fyllas med 4. De återstående cellerna i rad B kommer att fyllas med noll, eftersom B inte har någon utgående kant till någon annan nod.

Steg 3) Punkt C har inga direkta kanter med några andra noder. Så rad C kommer att fyllas med nollor.

Steg 4) Vertex D har en riktad kant med A och C.

  • Cellen i rad D och kolumn A kommer att ha värdet 7. Cellen i rad D och kolumn C kommer att ha värdet 2.
  • Resten av cellerna i rad D kommer att fyllas med nollor.

Steg 5) Punkt E har en riktad kant med B och D. Cellen i rad E och kolumn B kommer att ha värdet 6. Cellen i rad E och kolumn D kommer att ha värdet 3. Resten av cellerna i rad E kommer att fyllas med nollor.

Här är några punkter att lägga märke till:

  • Grafen har inga självloopar när den primära diagonalen för adjacentmatrisen är 0.
  • Grafen är en riktad graf om cellerna vid (a, b) och (b, a) inte har samma värde. Annars är grafen oriktad.
  • Grafen är en viktad graf om värdet i någon cell är större än 1.

Det största problemet med adjacentmatrisen är att den kräver kvadratiskt utrymme. Även kanter som inte existerar allokerar fortfarande celler i minnet.

Om vi ​​till exempel har en graf med 100 noder, behövs 10 000 celler för att lagra den i RAMMed färre kanter i grafen kan allokering av så mycket minne vara slöseri. Så rymdkomplexiteten med hjälp av adjacentmatrisen är O(N²), där N är antalet noder i grafen.

Angränsningslista vs. Angränsningsmatris

Innan man väljer en representation är det bra att jämföra båda modellerna sida vid sida över de operationer som dominerar verkliga grafarbetsbelastningar:

OperationAdjacency matrisAngränsningslista
RymdkomplexitetO(V²)O(V + E)
Lägg till ett hörnO(V²)O (1)
Lägg till en kantO (1)O (1)
Ta bort en kantO (1)O(E)
Kontrollera om kanten (i, j) existerarO (1)O (grad av i)
Iterera över grannar till iO (V)O (grad av i)
Bäst förTäta grafer, frekventa kantfrågorGlesa grafer, traverseringstunga uppgifter

Kort sagt vinner adjacensmatrisen på kantsökningar i konstant tid, medan adjacenslistan vinner på minnes- och granniteration, vilket är anledningen till att algoritmer som BFS, DFS och Dijkstra vanligtvis parar ihop med adjacenslistor.

Fördelar och nackdelar med grafrepresentation

Varje representation har sina egna avvägningar. Att känna till styrkorna och svagheterna hos båda modellerna hjälper dig att välja rätt modell för det problem du löser.

Fördelar med adjacency-matris:

  • Konstanttids-O(1) kantexistensfrågor mellan valfritt par av noder.
  • Fast indexering gör matrisbaserade algoritmer som Floyd-Warshall och transitiv stängning enkla att implementera.
  • Viktade kanter passar naturligt i en enda matriscell.

Nackdelar med adjacency-matris:

  • Slösar bort O(V²) minne när grafen är gles.
  • Att lägga till ett nytt hörn kräver att hela matrisen ändras i storlek.
  • Iterering över grannar till en enda vertex tar O(V) även när vertexen bara har ett fåtal kanter.

Fördelar med angränsningslista:

  • Använder endast O(V + E)-minne, vilket ligger nära det verkliga kantantalet i glesa grafer.
  • Att lägga till en ny hörn eller kant är O(1).
  • Traversalalgoritmer som BFS och DFS itererar grannar i O(grad), vilket ger den totala körtiden för O(V + E).

Nackdelar med angränsningslista:

  • Att kontrollera om en specifik kant existerar tar O(grader) tid istället för O(1).
  • Cache-lokaliteten är svagare eftersom länkade listor är utspridda över minnet.
  • Viktade kanter behöver ett kompletterande fält eller en lista med par, vilket komplicerar datastrukturen något.

När man ska använda en adjacency-lista kontra en adjacency-matris

Valet av representation beror på grafens densitet och de operationer du kör oftast. Använd den här snabbguiden för att välja rätt struktur:

  • Föredra adjacensmatrisen när grafen är tät (E är nära V²), när kanterna sällan ändras, och när din algoritm frågar "finns det en kant mellan i och j?" många gånger.
  • Föredra angränsningslistan när grafen är gles (E är mycket mindre än V²), när vertex- eller kantmängden växer under exekvering, och när man passerar grafen med BFS, DFS eller Dijkstras kortaste vägalgoritm.
  • Föredrar en blandad modell (adjacency-lista plus en hash-uppsättning av kanter) när du behöver både snabb granniteration och O(1) kantfrågor, på bekostnad av extra minne.

Moderna grafbibliotek som NetworkX och igraph använder som standard angränsande listor eftersom de flesta verkliga grafer – sociala nätverk, vägkartor, webbsidor, paketberoenden – är glesa och kräver mycket traversering.

Vanliga frågor

En adjacenslista är en array av V länkade listor där varje lista vid index i lagrar varje noddel intill noddel i. Minnesanvändningen är O(V + E), vilket passar glesa grafer och traversalalgoritmer som BFS och DFS.

En adjacentmatris är en V × V tvådimensionell array där matris[i][j] har kantvikten eller 1 om en kant finns mellan hörn i och hörn j. Kantsökning är O(1) men minnet är alltid O(V²).

Adjacency-matrisen svarar på kantexistensfrågor i O(1). Adjacency-listan itererar grannar i O(grad), vilket är snabbare för traversalalgoritmer som BFS, DFS och Dijkstra. Det bästa valet beror på de operationer som dominerar din arbetsbelastning.

Använd en angränsningslista när grafen är gles, när noder och kanter ändras under körning och när algoritmen ofta passerar grannar. Sociala nätverk, vägkartor och webbsidesgrafer passar alla in i denna profil.

Använd en adjacentmatris när grafen är tät, när vertexmängden är fast och när algoritmen frågar samma kant upprepade gånger. Floyd-Warshall och transitiv stängning fungerar båda naturligt på adjacentmatriser.

Ja. För riktade grafer är matrisen inte symmetrisk och listan lagrar endast utgående grannar. För viktade grafer innehåller matriscellen vikten medan listan lagrar par av granne och vikt.

Grafiska neurala nätverk matar in adjacensmatriser eller glesa kanttensorer i maskininlärningslager för bedrägeridetektering, förutsägelse av molekylegenskaper och rekommendationssystem. Kunskapsgrafer förlitar sig också på adjacenslistkodningar för hämtningsutökad AI.

Ja. GitHub Copilot och ChatGPT genererar angränsningslista och matrisstandard för Python, C++och JavaUtvecklare behöver fortfarande verifiera kantfall såsom duplicerade kanter, självloopar och korrekt hantering av riktade eller viktade grafer.

Sammanfatta detta inlägg med: