Informatik II SS 2014 (Algorithmen & Datenstrukturen) Vorlesung 17 (8.7.2014) Minimale Spannbäume II Union Find, Prioritätswarteschlangen Algorithmen und Komplexität
Minimaler Spannbaum Gegeben: Zus. hängender, ungerichteter Graph,, mit Kantengewichten Minimaler Spannbaum, : Spannbaum mitkleinstemgesamtgewicht 1 1 2 3 3 9 7 3 4 2 15 8 6 6 1 5 8 6 9 7 2
Basis MST Algorithmus Invariante: Algorithmus hat zu jeder Zeit eine Kantenmenge, so dass Teilmenge eines minimalen Spannbaums ist. Basis MST Algorithmus: = while ist kein Spannbaum do Finde sichere Kante, für =, return Invariante ist eine gültige Schleifeninvariante Invariante + Abbruchbedingung ist ein MST! 3
Wie findet man sichere Kanten? Invariante es gibt immer mindestens eine sicher Kante ist Teilmenge eines MST und kann daher zu einem MST erweitert werden Zuerst benötigen wir ein paar Begriffe Schnitt, : Kante, ist eine Schnittkante bezüglich,, falls ein Ende in und ein Ende in ist. Wir nennen Kante, eine leichte Schnittkante bez.,, falls sie das kleinste Gewicht von allen Schnittkanten hat 4
Sichere Kanten Annahmen:,, ist zus. h., unger. Graph mit Kantengewichten ist Teilmenge (Teilgraph) eines MST Theorem: Sei, ein Schnitt, so dass keine Schnittkanten enthält und sei,,, eine leichte Schnittkante bezüglich,. Dann ist, eine sichere Kante für. 1 1 2 3 3 4 2 6 5 9 7 8 6 3 9 6 15 7 8 1 5
Kruskal s MST Algorithmus = while ist kein Spannbaum do, ist Kante mit kleinstem Gewicht, so dass, keinen Zyklus enthält =, Wir müssen zeigen, dass eine sichere Kante für ist 6
Kruskal s MST Algorithmus: Beispiel 1 13 16 3 6 4 14 7 2 28 10 21 31 23 17 9 19 12 20 25 8 18 11 7
Kruskal s MST Algorithmus: Bemerkungen Kruskal s Algorithmus berechnet minimalen Spannbaum Die hinzugefügte Kante ist in jedem Schritt sicher Wir haben gesehen, dass der Basis Algorithmus korrekt ist Kruskal s Algorithmus ist ein typisches Beispiel eines sogenannten Greedy Algorithmus Wir beginnen mit einer leeren Kantenmenge In jedem Schritt wird die im Moment beste Kante hinzugenommen Eine gewählte Kante wird nie wieder verworfen Wir werden noch kurz besprechen, wie man den Algorithmus effizient implementieren kann... 8
Implementierung Kruskal s Algorithmus Kruskal s Algorithmus (Pseudo Code) 1. = 2. Sortiere Kanten aufsteigend nach Kantengewicht 3. for =, (in sorted order) do 4. if and are in different components then 5. = 9
Implementierung Kruskal s Algorithmus Kruskal s Algorithmus (Pseudo Code) 1. = 2. Sortiere Kanten aufsteigend nach Kantengewicht 3. for =, (in sorted order) do 4. if and are in different components then 5. = Müssen Komponenten des durch bestimmten Graphen effizient verwalten können Laufzeit: log für s Sortieren, sowie die Gesamtzeit, um die Komponenten zu verwalten 10
Union Find / Disjoint Sets Datentyp Verwaltet eine Partition von Elementen Operationen: create : erzeugt eine leere Union Find DS U.makeSet(x) : fügt Menge zur Partition hinzu U.find(x) : gibt Menge mit Element zurück U.union(S1, S2) : vereinigt die Mengen 1 und 2 Details dazu werden in der Algorithmentheorie besprochen 11
Kruskal mit Union Find Kruskal s Algorithmus 1. = 2. U = create new 3. for all do 4. U.makeSet( ) 5. Sortiere Kanten aufsteigend nach Kantengewicht 6. for all =, (in sorted order) do 7. = U.find( ); = U.find( ) 8. if then 9. = 10. U.union(, ) 12
Kruskal: Laufzeitanalyse Beste Union Find Datenstruktur Laufzeit für Union Find Operationen auf Elementen ( makeset Operationen):,, ist die Inverse der Ackermannfunktion und wächst extrem langsam (für alle halbwegs vernünftigen,,, 5) Laufzeit Kruskal Kanten sortieren: log Union Find Operationen:, Insgesamt: log besser, falls Kantengewichte schneller sortiert werden können 13
MST Eindeutigkeit Im Allgemeinen ist der MST nicht eindeutig Satz: Bei paarweise verschiedenen Kantengewichten ist der MST eindeutig. 14
Prim s MST Algorithmus Sollte man wohl eigentlich Jarvík s Algorithmus nennen wurde 1957 von Prim und bereits 1930 von Jarvík publiziert Eine zweite Implementierung des Basis Algorithmus = while ist kein Spannbaum do Finde sichere Kante, für =, return Idee: ist immer ein zusammenhängender Teilbaum Starte bei einem beliebigen Knoten Baum wächst von aus, indem immer eine leichte Schnittkante des durch induzierten Schnitts hinzugefügt wird. 15
Sichere Kanten Annahmen:,, ist zus. h., unger. Graph mit Kantengewichten ist Teilmenge (Teilgraph) eines MST Theorem: Sei, ein Schnitt, so dass keine Schnittkanten enthält und sei,,, eine leichte Schnittkante bezüglich,. Dann ist, eine sichere Kante für. 1 1 2 3 3 4 2 6 5 9 7 8 6 3 9 6 15 7 8 1 16
Prim s MST Algorithmus = while ist kein Spannbaum do, ist Kante mit kleinstem Gewicht, so dass und =, Wir müssen zeigen, dass eine sichere Kante für ist 17
Prim s MST Algorithmus: Beispiel 1 13 16 3 6 4 14 7 2 28 10 21 31 23 17 9 19 12 20 25 8 18 11 18
Implementierung von Prim s Algorithmus Knoten, welche im Teilbaum sind, heissen markiert Knoten : ist der nächste Nachbar von im durch bestimmten Teilbaum dist, (oder falls NULL) for all do.marked = false; = ; = NULL = 0; = // Wir starten bei Knoten while there are unmarked nodes do = unmarked node with minimal for all neighbors of do if, then = ; =,.marked = true if then =, 19
Prioritätswarteschlange Heap / Priority Queue: Verwaltet eine Menge von (key,value) Paaren Operationen: create : erzeugt einen leeren Heap H.insert(x, key) : fügt Element x mit Schlüssel key ein H.getMin() : gibt Element mit kleinstem Schlüssel zurück H.deleteMin() : löscht Element mit kleinstem Schlüssel (gibt Element mit kleinstem Schlüssel zurück) H.decreaseKey(x, newkey) : Falls newkey kleiner als der aktuelle Schlüssel von x ist, wird der Schlüssel von x auf newkey gesetzt 20
Implementierung von Prim s Algorithmus for all do.marked = false; = ; = NULL = 0; = // Wir starten bei Knoten while there are unmarked nodes do = unmarked node with minimal for all neighbors of do if, then = ; =,.marked = true if then =, 21
Implementierung von Prim s Algorithmus = new priority queue; = for all do.insert(, ); = NULL.insert(, 0) while is not empty do = H.deleteMin() for all neighbors of do if, then.decreasekey(,, ) = if then =, 22
Analyse von Prim s MST Algorithmus Anzahl Priority Queue Operationen create insert getmin / deletemin decreasekey Gesamt Laufzeit 23
Prioritätswarteschlangen Implementierung als Binärbaum mit Min Heap Eigenschaft Die Datenstruktur heisst deshalb oft auch Heap Ein Baum hat die Min Heap Eigenschaft, falls in jedem Teilbaum, die Wurzel den kleinsten Schlüssel hat getmin Operation: trivial! Baum wird immer so balanciert, wie möglich gehalten 24
Prioritätswarteschlangen: Einfügen 3 10 7 12 13 23 9 17 14 25
Prioritätswarteschlangen: Delete Min 3 10 7 11 13 23 9 17 14 16 26
Prioritätswarteschlangen: Decrease Key 3 10 7 11 13 23 9 17 14 16 17 24 27