Datastructuren voor graafrepresentatie Algoritmiek
Taken Tel of enumereer alle knopen of kanten in graaf Tel of enumereer alle buren van een knoop of alle incidente kanten (ingaande/uitgaande pijlen) Test of er kant tussen twee knopen is Toevoegen van kanten en knopen Verwijderen van kanten en knopen Algoritmiek
Oplossing 1: lijsten Lijst van knopen en lijst van kanten Alle knopen of kanten tellen/enumereren is snel Rest is traag: O(a) per operatie Hoe vind ik een kant tussen 2 knopen in de lijst? Hele lijst doorzoeken Hoe vind ik een incidente kant? Hele lijst doorzoeken Voordeel: O(n+a) ruimte Algoritmiek
Oplossing 2: adjacency list Lijst van knopen Voor iedere knoop: lijst van incidente kanten of van buren (ingaande/uitgaande pijlen/buren) 1 2 v1 v2 v3 v4 v5 v6 v2 v1 v3 v5 v4 v6 3 Lijst: array of linked list 4 5 6 Algoritmiek
Oplossing 2: adjacency list Lijst van knopen Voor iedere knoop: lijst van incidente kanten of van buren (ingaande/uitgaande pijlen/buren) 1 2 v1 v2 v3 v4 v5 v6 3 a12 a12 a23 a34 a45 a56 Lijst: array of linked list 4 a23 a34 a45 a56 5 6 Algoritmiek
Adjacency list: implementatie (1) Alle knopen of kanten tellen/enumereren is snel Alle buren van een knoop of alle incidente kanten (ingaande/uitgaande pijlen) enumeren is snel Testen of er een kant tussen u,v is: traag Kijk naar lijst met buren/incidente kanten van u of v erin voorkomt Θ(maximum graad) O(log maximum graad) als knopen gesorteerd Lijst: array of linked list Algoritmiek
Adjacency list: implementatie (2) Toevoegen: O(1) tijd Verwijderen: zelfde tijd als om kant tussen u,v te vinden Nog steeds O(n+a) ruimte Lijst per knoop kan een linked list of een array/vector zijn Algoritmiek
Oplossing 3: adjacency matrix n bij n matrix: elementen 0 of 1 (0,1,-1) element (i,j) is 1 dan en slechts dan als er een kant is tussen knoop i en knoop j Gerichte grafen: gebruik 1,-1 voor richting 1 2 1 2 3 4 5 6 3 4 5 6 Algoritmiek
Oplossing 3: adjacency matrix Testen er een kant tussen twee knopen is: O(1) Bekijk juiste element in matrix Alle knopen tellen/enumereren is snel Rest is traag Bijv.: incidente kanten tellen kost Θ(n) Hele rij moet bekeken worden Kant toevoegen/verwijderen is snel: O(1) Nadeel: Θ(n2) bits ruimte Algoritmiek
Afweging (1) Adjacency matrix Eenvoudig te implementeren O(n2) bits Kan nog efficiënt zijn bij kleine grafen Adjacency list Meest ruimte-efficiënt, vooral voor grote of ijle grafen Meeste operaties zeer snel Meest gebruikt in praktijk Algoritmiek
Afweging (2) Kijk goed naar welke operaties je nodig hebt in je algoritme Is je graaf ijl? Is geheugenruimte een probleem? Meest gebruikt: adjacency list Combinatie ook mogelijk, maar lastig te implementeren Gewichten: in beide datastructuren goed op te slaan Pas op: gewicht is misschien op 2 plekken opgeslagen Algoritmiek
Incidentie matrix n bij a matrix: ieder element 0 of 1 (0,1,-1) Element (i,j) is 1 dan en slechts dan als kant j incident is op knoop i Gerichte grafen: gebruik -1, 1 Traag en ruimteverkwistend Maar wel handig voor sommige wiskundige operaties Algoritmiek