Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung Datenstrukturen für den Algorithmus von Dijkstra
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Ü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 II - SS 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( K i succ(K) ) { if (K i (GRÜN BLAU) //noch nicht besuchter Knoten färbe die Kante (K,K i ) rot; färbe K i grün; dist(K i ) = dist(K) + dist(K,K i ); }... aus der letzten Vorlesung
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Vorgehen Repräsentation des Graphen –„ for( K i succ(K) „ –Variante a: Adjazenzmatrix –Variante b: Adjazenzliste grüne Knotenmenge
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Adjazenzmatrix Definition: Knoten, die durch eine Kante verbunden sind, heißen benachbart oder adjazent. Definition: Die n n Matrix A = (a ij ) mit heißt Adjazenzmatrix des Graphen.
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Adjazenzmatrix mit Kosten k beachte: alle Diagonalelemente sind 0
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Adjazenzmatrix Do Ha W Du K D
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Adjazenzmatrix Vorteil: Möglichkeit, in einer Laufzeit von O(1) festzustellen, ob eine Kante von K i nach K j existiert. Nachteil: hoher Platzbedarf: O(n 2 )
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung 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 II - SS Vorlesung Adjazenzliste Do Ha W D K Du Array
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Adjazenzliste Du80W15Du30Ha20D150K15 Do Ha W D K Du D20K80
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Adjazenzliste Vorteil: geringer Platzbedarf: O(n+e) (e = Anzahl der Kanten) Nachteil: Um zu prüfen, ob k i und k j benachbart sind, muß die Adjazenzliste von k i durchlaufen und nach k j durchsucht werden. aber: für Dijkstra idealideal
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung 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 II - SS Vorlesung Do Ha W Du K D W die „grünen Knoten“ abgearbeitet noch in Arbeit noch nicht betrachtet
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung 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 II - SS Vorlesung Einbettung in einen Array: index(k) = n –index (k.linkerSohn) = 2 n –index (k.rechterSohn) = 2 n + 1 –index (k.vater) = Eine neue Datenstruktur: Der Heap 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}
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Entfernen des kleinsten Elements 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 Baum sei 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öhne benenne p, q, r um
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Entfernen des kleinsten Elements 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 Baum sei 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öhne benenne p, q, r um
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Entfernen des kleinsten Elements 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 Baum sei 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öhne benenne p, q, r um
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Entfernen des kleinsten Elements 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 Baum sei 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öhne benenne p, q, r um
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Entfernen des kleinsten Elements 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 Baum sei 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öhne benenne p, q, r um
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Entfernen des kleinsten Elements 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 Baum sei 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öhne benenne p, q, r um
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung Entfernen des kleinsten Elements 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 Baum sei 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öhne benenne p, q, r um
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung 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 Beispiel: füge „0“ ein
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung 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 Beispiel: füge „0“ ein 0 0
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung 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 Beispiel: füge „0“ ein 13 / 2 = 6
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung 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 Beispiel: füge „0“ ein 0 6
Lutz Plümer - Diskrete Mathematik II - SS Vorlesung 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 Beispiel: füge „0“ ein 0 6
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 II - SS Vorlesung