Informatik II ‐ SS 2014 (Algorithmen & Datenstrukturen) Vorlesung 17 (8.7.2014) Minimale Spannbäume II Union‐Find, Prioritätswarteschlangen Fabian Kuhn Algorithmen und Komplexität Fabian Kuhn Informatik II, SS 2014 Minimaler Spannbaum Gegeben: Zus.‐hängender, ungerichteter Graph Kantengewichten ∶ → , , mit Minimaler Spannbaum , : • Spannbaum mit kleinstem Gesamtgewicht 1 1 2 3 9 3 15 3 7 8 4 2 6 1 6 5 8 Fabian Kuhn 6 9 Informatik II, SS 2014 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 , für Finde sichere Kante = ∪ , return • Invariante ist eine gültige Schleifeninvariante • Invariante + Abbruchbedingung ⟹ Fabian Kuhn Informatik II, SS 2014 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 Fabian Kuhn Informatik II, SS 2014 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 3 9 3 2 15 3 7 8 4 2 6 6 1 5 8 Fabian Kuhn 6 9 7 Informatik II, SS 2014 5 Kruskal’s MST‐Algorithmus = ∅ while ist kein Spannbaum do , ist Kante mit kleinstem Gewicht, , keinen Zyklus enthält so dass ∪ = ∪ , • Wir müssen zeigen, dass eine sichere Kante für Fabian Kuhn Informatik II, SS 2014 ist 6 Kruskal’s MST‐Algorithmus: Beispiel 1 3 13 6 10 23 4 14 21 2 7 28 31 16 17 9 19 25 12 8 20 18 Fabian Kuhn 11 Informatik II, SS 2014 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... Fabian Kuhn Informatik II, SS 2014 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. = ∪ Fabian Kuhn Informatik II, SS 2014 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 verwalten können bestimmten Graphen effizient • Laufzeit: log für’s Sortieren, sowie die Gesamtzeit, um die Komponenten zu verwalten… Fabian Kuhn Informatik II, SS 2014 10 Union‐Find / Disjoint Sets Datentyp Verwaltet eine Partition von Elementen Operationen: • create • U.makeSet(x) • U.find(x) • U.union(S1, S2) : erzeugt eine leere Union‐Find‐DS : fügt Menge zur Partition hinzu : gibt Menge mit Element zurück : vereinigt die Mengen 1 und 2 • Details dazu werden in der Algorithmentheorie besprochen… Fabian Kuhn Informatik II, SS 2014 11 Kruskal mit Union‐Find Kruskal’s Algorithmus 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. = ∅ U = create new for all ∈ do U.makeSet( ) Sortiere Kanten aufsteigend nach Kantengewicht for all = , ∈ (in sorted order) do = U.find( ); = U.find( ) if then = ∪ U.union( , ) Fabian Kuhn Informatik II, SS 2014 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 Fabian Kuhn Informatik II, SS 2014 13 MST Eindeutigkeit • Im Allgemeinen ist der MST nicht eindeutig Satz: Bei paarweise verschiedenen Kantengewichten ist der MST eindeutig. Fabian Kuhn Informatik II, SS 2014 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. Fabian Kuhn Informatik II, SS 2014 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 3 9 3 2 15 3 7 8 4 2 6 6 1 5 8 Fabian Kuhn 6 9 7 Informatik II, SS 2014 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 Fabian Kuhn Informatik II, SS 2014 ist 17 Prim’s MST‐Algorithmus: Beispiel 1 3 13 6 10 23 4 14 21 2 7 28 31 16 17 9 19 25 12 8 20 18 Fabian Kuhn 11 Informatik II, SS 2014 18 Implementierung von Prim’s Algorithmus • Knoten, welche im Teilbaum • Knoten : – – sind, heissen markiert ist der nächste Nachbar von im durch dist , (oder ∞ falls bestimmten Teilbaum NULL) for all ∈ ∖ do = NULL .marked = false; = ∞; = 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 = ∪ , Fabian Kuhn Informatik II, SS 2014 19 Prioritätswarteschlange Heap / Priority Queue: • Verwaltet eine Menge von (key,value)‐Paaren Operationen: • create • H.insert(x, key) • H.getMin() • H.deleteMin() : erzeugt einen leeren Heap : fügt Element x mit Schlüssel key ein : gibt Element mit kleinstem Schlüssel zurück : 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 Fabian Kuhn Informatik II, SS 2014 20 Implementierung von Prim’s Algorithmus for all ∈ ∖ do .marked = false; = 0; = ∅ = NULL = ∞; // Wir starten bei Knoten while there are unmarked nodes do = unmarked node with minimal for all neighbors , if = ; of do then = , .marked = true if then = ∪ Fabian Kuhn , Informatik II, SS 2014 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 , then if .decreaseKey( , = if Fabian Kuhn then = ∪ , ) , Informatik II, SS 2014 22 Analyse von Prim’s MST‐Algorithmus Anzahl Priority Queue Operationen • create • insert • getMin / deleteMin • decreaseKey Gesamt‐Laufzeit Fabian Kuhn Informatik II, SS 2014 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 Fabian Kuhn Informatik II, SS 2014 24 Prioritätswarteschlangen: Einfügen 3 10 13 12 17 Fabian Kuhn 7 23 9 14 Informatik II, SS 2014 25 Prioritätswarteschlangen: Delete‐Min 3 10 7 13 11 17 Fabian Kuhn 14 23 9 16 Informatik II, SS 2014 26 Prioritätswarteschlangen: Decrease‐Key 3 10 7 13 11 17 Fabian Kuhn 14 16 23 17 9 24 Informatik II, SS 2014 27