Kein Folientitel - Institut für Geodäsie und Geoinformation der

Werbung
Institut für Kartographie und Geoinformation
Prof. Dr. Lutz Plümer
Diskrete Mathematik II
Vorlesung 2
SS 2001
Datenstrukturen für den
Algorithmus von Dijkstra
Übersicht
• letzte Stunde
– Algorithmus von Dijkstra
– alle kürzesten Wege von einem Knoten (1:n)
• heute:
– Datenstrukuren für den Algorithmus von Dijkstra
• Datenstruktur für Graphen mit Kosten
– Adjazenzliste
– Adjazenzmatrix
• Datenstruktur für grüne Knoten
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
2
... aus der letzten Vorlesung
algorithm Dijkstra (S)
{berechne alle kürzesten Wege von S aus}
BLAU = ; GRÜN = {S}; dist(S) = 0;
while( GRÜN   ) {
wähle K  GRÜN, so daß  K‘  GRÜN:
dist(K)  dist(K‘);
färbe K blau;
for( Ki  succ(K) ) {
if (Ki  (GRÜN  BLAU) //noch nicht besuchter Knoten
färbe die Kante (K,Ki) rot;
färbe Ki grün;
dist(Ki) = dist(K) + dist(K,Ki); }
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
3
Vorgehen
• Repräsentation des Graphen
– „ for( Ki  succ(K) „
– Variante a: Adjazenzmatrix
– Variante b: Adjazenzliste
• grüne Knotenmenge
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
4
Adjazenzmatrix
Definition: Knoten, die durch eine Kante verbunden
sind, heißen benachbart oder adjazent.
Definition: Die n  n Matrix A = (aij) mit
 true falls K i und K j adjazent
a ij  
 false sonst
heißt Adjazenzmatrix des Graphen.
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
5
Adjazenzmatrix mit Kosten
k
falls k die Kosten der

k
aij  
Kante von K i nach K j
 sonst
beachte: alle Diagonalelemente sind 0
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
6
Adjazenzmatrix
Do
80
Du
20
Ha
30
20
15
W
D
150
15
K
80
Do Du Ha W D K
Do  0 80 20    


Du   0   20  
Ha    0 15   


W   30  0 150 80 
D      0 15 


K      
0 
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
7
Adjazenzmatrix
• Vorteil: Möglichkeit, in einer Laufzeit von O(1)
festzustellen, ob eine Kante von Ki nach Kj existiert.
• Nachteil: hoher Platzbedarf: O(n2)
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
8
Adjazenzliste
• Für jeden Knoten wird eine Liste seiner
(Nachfolger-) Nachbarknoten verwaltet.
• Über ein Array der Länge n (n = Anzahl der Knoten)
ist jede Liste direkt zugänglich
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
9
Adjazenzliste
Do Du Ha W D K
Do  0 80 20    


Du   0   20  


Ha    0 15   


W   30  0 150 80 


D      0 15 


K      0 
Do
Array
Du
Ha
W
D
K
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
10
Adjazenzliste
Do Du Ha W D K
Do  0 80 20    


Du   0   20  


Ha    0 15   


W   30  0 150 80 


D      0 15 


K      0 
Do
Du 80
Du
D 20
Ha
W 15
W
Du 30
D
K 15
K
Ha 20
D 150
K 80
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
11
Adjazenzliste
• Vorteil: geringer Platzbedarf: O(n+e) (e = Anzahl der
Kanten)
• Nachteil: Um zu prüfen, ob ki und kj benachbart
sind, muß die Adjazenzliste von ki durchlaufen und
nach kj durchsucht werden.
• aber: für Dijkstra ideal
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
12
Repräsentation der „grünen Knoten“
• die „aktiven“ Knoten
• Operationen
– Algorithmus:
• füge die Nachfolger des betrachteten Knoten ein
• selektiere und entferne das kleinste Element
• Ziel:
• Einfügen eines Knotens in O(log n)
• Finden und Entfernen des kleinsten Knotens in O(log n)
– Variante A: AVL-Baum
– spezialisierter auf diese Anwendung: Heap
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
13
die „grünen Knoten“
Do
80
Du
20
30
20
abgearbeitet
Ha
15
W
D
noch in Arbeit
15
80
K
noch nicht betrachtet
Eine neue Datenstruktur: der Heap
• Idee: ein zu jeder Zeit möglichst vollständiger Baum
– alle Ebenen bis auf die letzte sind voll besetzt
• Darstellung eines vollständigen Baums in einem
Array
• Problem: Bestimmung der Kanten auf Indizes
– Index des Vaters
– Indizes der beiden Söhne
• Beispiel: Eingabe der sortierten Folge von Zahlen
{1 .. 15}
• achten Sie auf die Indizierung
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
15
Eine neue Datenstruktur: Der Heap
1
2
3
4
8
5
9
• ein partiell geordneter
Baum
10
6
11
12
7
13 14
15
• für jeden Teilbaum T‘ mit
Wurzel x gilt:
info(y)  info(x)
für jeden Knoten y von T‘
{in der Wurzel steht das
Minimum des Teilbaums}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Einbettung in einen Array:
• index(k) = n
– index (k.linkerSohn) = 2  n
– index (k.rechterSohn) = 2  n + 1
n
– index (k.vater) =  2
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
16
Entfernen des kleinsten Elements
algorithm deletemin (H)
1
/*lösche das minimale Element
2
3
des Heaps und gib es aus*/
gib den Eintrag der Wurzel
4
5
6
7
aus;
lösche die Wurzel und
8
9 10
11 12
13 14
15
ersetze sie durch die
letzte Position im Baum
sei p die Wurzel mit den
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Söhnen q und r;
while q oder r existieren und
((info (p) > info (q)) oder
(info (p) > info (r)))
vertausche p mit dem kleineren
der beiden Söhne
benenne p, q, r um
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
17
Entfernen des kleinsten Elements
algorithm deletemin (H)
1
/*lösche das minimale Element
2
3
des Heaps und gib es aus*/
gib den Eintrag der Wurzel
4
5
6
7
aus;
lösche die Wurzel und
8
9 10
11 12
13 14
15
ersetze sie durch die
letzte Position im Baum
sei p die Wurzel mit den
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Söhnen q und r;
while q oder r existieren und
((info (p) > info (q)) oder
(info (p) > info (r)))
vertausche p mit dem kleineren
der beiden Söhne
benenne p, q, r um
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
18
Entfernen des kleinsten Elements
algorithm deletemin (H)
/*lösche das minimale Element
2
3
des Heaps und gib es aus*/
gib den Eintrag der Wurzel
4
5
6
7
aus;
lösche die Wurzel und
8
9 10
11 12
13 14
15
ersetze sie durch die
letzte Position im Baum
sei p die Wurzel mit den
2 3 4 5 6 7 8 9 10 11 12 13 14 15
Söhnen q und r;
while q oder r existieren und
((info (p) > info (q)) oder
(info (p) > info (r)))
vertausche p mit dem kleineren
der beiden Söhne
benenne p, q, r um
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
19
Entfernen des kleinsten Elements
15
algorithm deletemin (H)
/*lösche das minimale Element
2
3
des Heaps und gib es aus*/
gib den Eintrag der Wurzel
4
5
6
7
aus;
lösche die Wurzel und
8
9 10
11 12
13 14
ersetze sie durch die
letzte Position im Baum
sei p die Wurzel mit den
15 2 3 4 5 6 7 8 9 10 11 12 13 14
Söhnen q und r;
while q oder r existieren und
((info (p) > info (q)) oder
(info (p) > info (r)))
vertausche p mit dem kleineren
der beiden Söhne
benenne p, q, r um
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
20
Entfernen des kleinsten Elements
2
algorithm deletemin (H)
/*lösche das minimale Element
15
3
des Heaps und gib es aus*/
gib den Eintrag der Wurzel
4
5
6
7
aus;
lösche die Wurzel und
8
9 10
11 12
13 14
ersetze sie durch die
letzte Position im Baum
sei p die Wurzel mit den
2 15 3 4 5 6 7 8 9 10 11 12 13 14
Söhnen q und r;
while q oder r existieren und
((info (p) > info (q)) oder
(info (p) > info (r)))
vertausche p mit dem kleineren
der beiden Söhne
benenne p, q, r um
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
21
Entfernen des kleinsten Elements
2
algorithm deletemin (H)
/*lösche das minimale Element
4
3
des Heaps und gib es aus*/
gib den Eintrag der Wurzel
15
5
6
7
aus;
lösche die Wurzel und
8
9 10
11 12
13 14
ersetze sie durch die
letzte Position im Baum
sei p die Wurzel mit den
2 4 3 15 5 6 7 8 9 10 11 12 13 14
Söhnen q und r;
while q oder r existieren und
((info (p) > info (q)) oder
(info (p) > info (r)))
vertausche p mit dem kleineren
der beiden Söhne
benenne p, q, r um
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
22
Entfernen des kleinsten Elements
2
algorithm deletemin (H)
/*lösche das minimale Element
4
3
des Heaps und gib es aus*/
gib den Eintrag der Wurzel
8
5
6
7
aus;
lösche die Wurzel und
15 9 10
11 12
13 14
ersetze sie durch die
letzte Position im Baum
sei p die Wurzel mit den
2 4 3 8 5 6 7 15 9 10 11 12 13 14
Söhnen q und r;
while q oder r existieren und
((info (p) > info (q)) oder
(info (p) > info (r)))
vertausche p mit dem kleineren
der beiden Söhne
benenne p, q, r um
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
23
Einfügen eines neuen Elements
algorithm insert (H,e)
/*füge Element e in H ein*/
füge einen neuen Knoten q mit
Eintrag e an der ersten freien
Position der untersten Ebene
des Baumes ein, eröffne ggf.
neue Ebene;
p sei der Vater von q;
while p existiert und
(info (q) < info (p)) do
vertausche p und q
benenne p und q um
1
2
3
4
8
5
9
10
6
11
7
12
1 2 3 4 5 6 7 8 9 10 11 12
Beispiel: füge „0“ ein
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
24
Einfügen eines neuen Elements
algorithm insert (H,e)
/*füge Element e in H ein*/
füge einen neuen Knoten q mit
Eintrag e an der ersten freien
Position der untersten Ebene
des Baumes ein, eröffne ggf.
neue Ebene;
p sei der Vater von q;
while p existiert und
(info (q) < info (p)) do
vertausche p und q
benenne p und q um
1
2
3
4
8
5
9
10
6
11
12
7
0
1 2 3 4 5 6 7 8 9 10 11 12
0
Beispiel: füge „0“ ein
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
25
Einfügen eines neuen Elements
algorithm insert (H,e)
/*füge Element e in H ein*/
füge einen neuen Knoten q mit
Eintrag e an der ersten freien
Position der untersten Ebene
des Baumes ein, eröffne ggf.
neue Ebene;
p sei der Vater von q;
while p existiert und
(info (q) < info (p)) do
vertausche p und q
benenne p und q um
1
2
3
4
8
5
9
10
0
11
12
7
6
1 2 3 4 5 0 7 8 9 10 11 12 6
13 / 2  = 6
13
Beispiel: füge „0“ ein
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
26
Einfügen eines neuen Elements
algorithm insert (H,e)
/*füge Element e in H ein*/
füge einen neuen Knoten q mit
Eintrag e an der ersten freien
Position der untersten Ebene
des Baumes ein, eröffne ggf.
neue Ebene;
p sei der Vater von q;
while p existiert und
(info (q) < info (p)) do
vertausche p und q
benenne p und q um
1
2
0
4
8
5
9
10
3
11
12
7
6
1 2 0 4 5 3 7 8 9 10 11 12 6
Beispiel: füge „0“ ein
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
27
Einfügen eines neuen Elements
algorithm insert (H,e)
/*füge Element e in H ein*/
füge einen neuen Knoten q mit
Eintrag e an der ersten freien
Position der untersten Ebene
des Baumes ein, eröffne ggf.
neue Ebene;
p sei der Vater von q;
while p existiert und
(info (q) < info (p)) do
vertausche p und q
benenne p und q um
0
2
1
4
8
5
9
10
3
11
12
7
6
0 2 1 4 5 3 7 8 9 10 11 12 6
Beispiel: füge „0“ ein
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
28
Für „Kenner“
• Bestimmen des
Vaterknotens:
ganzzahlige Division durch 2
• Bestimmen des Sohns:
Multiplikation mit 2
– ggf. Addition von 1
• auf Maschinenebene
einfache
Bit-Schiftoperationen
Für „Hacker“ ?
Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
29
Herunterladen