Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdBart Kuipersё Laatst gewijzigd meer dan 6 jaar geleden
1
Datastructuren voor graafrepresentatie
Algoritmiek
2
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
3
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
4
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
5
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
6
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
7
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
8
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
9
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
10
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
11
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
12
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
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.