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