290 likes | 471 Views
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
E N D
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
... 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
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
Definition: Die n n Matrix A = (aij) mit heißt Adjazenzmatrix des Graphen. Adjazenzmatrix Definition: Knoten, die durch eine Kante verbunden sind, heißen benachbart oder adjazent. Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
Adjazenzmatrix mit Kosten k beachte: alle Diagonalelemente sind 0 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
Do 80 Du 20 Ha 30 20 15 W D 15 80 K Adjazenzmatrix 150 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
Adjazenzmatrix • Vorteil: Möglichkeit, in einer Laufzeit von O(1) festzustellen, ob eine Kante vonKi nach Kj existiert. • Nachteil: hoher Platzbedarf: O(n2) Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
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
Do Du Ha W D K Adjazenzliste Array Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
Du 80 Do Ha 20 Du W D 20 15 D 150 Ha Du 30 W K 80 K 15 D K Adjazenzliste Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
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
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
Do 80 Du 20 Ha 30 20 15 W D 15 80 K die „grünen Knoten“ abgearbeitet W noch in Arbeit 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
Einbettung in einen Array: index(k) = n index (k.linkerSohn) = 2 n index (k.rechterSohn) = 2 n + 1 index (k.vater) = 2 3 4 5 6 7 8 10 11 12 13 14 15 Eine neue Datenstruktur: Der Heap 1 • ein partiell geordneter Baum • 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} 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
algorithm deletemin (H) /*lösche das minimale Element des Heaps und gib es aus*/ gib den Eintrag der Wurzel aus;lösche die Wurzel und ersetze sie durch die letzte Position im Baumsei p die Wurzel mit den 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öhnebenenne p, q, r um 1 2 3 9 4 5 6 7 8 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Entfernen des kleinsten Elements Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
algorithm deletemin (H) /*lösche das minimale Element des Heaps und gib es aus*/ gib den Eintrag der Wurzel aus;lösche die Wurzel und ersetze sie durch die letzte Position im Baumsei p die Wurzel mit den 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öhnebenenne p, q, r um 1 4 5 6 7 8 10 11 12 13 14 15 Entfernen des kleinsten Elements 2 3 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
algorithm deletemin (H) /*lösche das minimale Element des Heaps und gib es aus*/ gib den Eintrag der Wurzel aus;lösche die Wurzel und ersetze sie durch die letzte Position im Baumsei p die Wurzel mit den 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öhnebenenne p, q, r um 4 5 6 7 8 10 11 12 13 14 15 Entfernen des kleinsten Elements 2 3 9 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
algorithm deletemin (H) /*lösche das minimale Element des Heaps und gib es aus*/ gib den Eintrag der Wurzel aus;lösche die Wurzel und ersetze sie durch die letzte Position im Baumsei p die Wurzel mit den 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öhnebenenne p, q, r um 4 5 6 7 8 10 11 12 13 14 Entfernen des kleinsten Elements 15 2 3 9 15 2 3 4 5 6 7 8 9 10 11 12 13 14 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
algorithm deletemin (H) /*lösche das minimale Element des Heaps und gib es aus*/ gib den Eintrag der Wurzel aus;lösche die Wurzel und ersetze sie durch die letzte Position im Baumsei p die Wurzel mit den 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öhnebenenne p, q, r um 4 5 6 7 8 10 11 12 13 14 Entfernen des kleinsten Elements 2 15 3 9 2 15 3 4 5 6 7 8 9 10 11 12 13 14 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
algorithm deletemin (H) /*lösche das minimale Element des Heaps und gib es aus*/ gib den Eintrag der Wurzel aus;lösche die Wurzel und ersetze sie durch die letzte Position im Baumsei p die Wurzel mit den 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öhnebenenne p, q, r um 15 5 6 7 8 10 11 12 13 14 Entfernen des kleinsten Elements 2 4 3 9 2 4 3 15 5 6 7 8 9 10 11 12 13 14 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
algorithm deletemin (H) /*lösche das minimale Element des Heaps und gib es aus*/ gib den Eintrag der Wurzel aus;lösche die Wurzel und ersetze sie durch die letzte Position im Baumsei p die Wurzel mit den 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öhnebenenne p, q, r um 5 6 7 15 10 11 12 13 14 Entfernen des kleinsten Elements 2 4 3 8 9 2 4 3 8 5 6 7 15 9 10 11 12 13 14 Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2
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 2 3 4 5 6 7 8 10 11 12 Einfügen eines neuen Elements 1 9 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
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 2 3 4 5 6 7 8 10 11 12 Einfügen eines neuen Elements 1 9 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
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 2 3 4 5 0 7 8 10 11 12 Einfügen eines neuen Elements 1 9 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
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 2 0 4 5 3 7 8 10 11 12 Einfügen eines neuen Elements 1 9 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
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 2 1 4 5 3 7 8 10 11 12 Einfügen eines neuen Elements 0 9 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
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“ ? Für „Kenner“ Lutz Plümer - Diskrete Mathematik - 2. Semester - SS 2001 - Vorlesung 2