02.07.2009 Überblick Kap. 6.5: Minimale Spannbäume ff • 6.5: Minimale Spannbäume (MST) ff: - Algorithmus von Prim Professor Dr. Petra Mutzel Karsten Klein Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund 20. VO 2. TEIL DAP2 SS 2009 2. Juli 2009 Petra Mutzel DAP2 SS08 SS09 1 Petra Mutzel DAP2 SS09 2 Grundideen • MST: Algorithmus von Prim • Kürzeste Wege in Graphen (s. nächste Vorlesung): Algorithmus von Dijkstra Algorithmus von Prim Beide nutzen ähnliches Konzept: • Greedy (gierig, gefräßig) später mehr dazu • Priority Queue • Lassen einzelnen Baum wachsen Petra Mutzel basiert auf: DAP2 SS09 basiert auf MST Eigenschaft: 4 Petra Mutzel DAP2 SS09 12 MST Eigenschaft MST Eigenschaft Lemma 1 (Wiederholung): Sei G=(V,E) zshgd. mit Gewichtsfunktion w : E→R. Seien: Aussichtsreiche Menge T von Kanten: Es existiert ein MST, der alle Kanten von T enthält. • S ⊂ V • T ⊂ E aussichtsreich und keine Kante aus T verlässt S • e∈E Kante mit minimalem Gewicht, die S verlässt Dann ist T ⋃ {e} aussichtsreich. Petra Mutzel DAP2 SS09 13 Petra Mutzel DAP2 SS09 14 1 02.07.2009 PRIMs Algorithmus: lasse Baum von s aus MST wachsen mitEigenschaft MST Eigenschaft Kantenmenge T, aussichtsreich Kante e verläßt S mit min. Gewicht Vgl. mit Kruskal: • Kruskal läßt Wald wachsen mit Union-Find bis Spannbaum erzeugt e s Algorithmus von Prim • Prim läßt von Startknoten s einen einzelnen Baum wachsen Knotenmenge S MST sind nicht eindeutig!! s Dann: T∪e aussichtsreich Petra Mutzel DAP2 SS09 15 Petra Mutzel Algorithmus von Prim DAP2 SS09 Wähle Startknoten s ∈ V S := {s}; T := ø Wähle e = (u, v), e verläßt S mit min. Gewicht T := T ⋃ {e}: S:= S ⋃ {v} } 17 Petra Mutzel DAP2 SS09 18 Algorithmus von Prim Induktion über Kanten e1,…,ek , die zu T hinzugefügt werden: Zeige: Ti = {e1,…,ei} aussichtsreich für 0 ≤ i ≤ k i = 0: T0 = ø ⇒ aussichtsreich 1 ≤ i ≤ k: Ti-1 aussichtsreich, S Knotenmenge vor Hinzunahme von ei, keine Kante aus Ti-1 verläßt S ⇒ ei leichteste S verlassende Kante ⇒ Mit Lemma 1: Ti = Ti-1 ⋃ {ei } aussichtsreich Und: Keine Kante aus Ti verläßt neues S Am Ende hat T genau |V|-1 Kanten ⇒ MST DAP2 SS09 // S Unterbaumknoten, T Kanten while S ≠ V do { Korrektheit Prim Petra Mutzel 16 Schema: Algorithmus von Prim Idee: • Verwalte Menge S von Knoten in Unterbaum,ausgehend von s, T leer • Wähle billigste S verlassende Kante e=(u,v), v ∈ S , e ∈ T ⇒ (Lemma 1) T aussichtsreich • Stop, falls S=V ⇒ T bildet MST Petra Mutzel DAP2 SS09 b 2 12 c g 7 11 9 s 2 d 10 4 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti 19 Petra Mutzel DAP2 SS09 20 2 02.07.2009 Algorithmus von Prim b 4 2 12 b g 7 11 9 s 2 d 10 Algorithmus von Prim c e 7 4 f 5 h 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel 2 12 DAP2 SS09 4 2 12 c f 5 b h 5 2 12 b DAP2 SS09 2 12 c 5 f f i 8 h 1 Petra Mutzel b 5 h DAP2 SS09 5 24 DAP2 SS09 c g 7 11 2 12 2 d 10 9 s i 8 1 g 7 4 5 4 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel c g 7 4 2 7 e 23 7 e 22 Algorithmus von Prim 11 9 s 2 d 10 DAP2 SS09 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Algorithmus von Prim 4 5 11 9 s Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel h 1 d 10 4 i 8 1 f 5 i 8 Petra Mutzel g 7 4 7 4 21 7 e c e Algorithmus von Prim 11 9 s 2 d 10 7 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Algorithmus von Prim b g 11 9 s i 8 1 4 2 d 10 e 7 4 5 f i 8 h 1 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti 25 Petra Mutzel DAP2 SS09 26 3 02.07.2009 Algorithmus von Prim b 4 2 12 b g 7 11 9 s 2 d 10 Algorithmus von Prim c e 7 4 f 5 h 5 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel DAP2 SS09 10 4 2 27 12 c 7 4 f 5 h 1 5 h DAP2 SS09 28 DAP2 SS09 T := T ⋃ {e}: S:= S ⋃ {v} } Effiziente Realisierung? 29 Realisierung von Prim Petra Mutzel DAP2 SS09 30 Dazu: ADT Priority Queue • Dyn. Verwaltung von Elementmenge mit Prioritäten • Operationen: – INSERT(p, v) : Position // Knoten v, Priorität p – DELETE(pos) – MINIMUM() : Position – EXTRACTMIN() : P x V //Rückg: min-Knoten und prio – DECREASEPRIORITY(pos, p) // neue Priorität p • Bekannt: Binary (Min-)Heap in Array • Kein Sortieren nötig • Auswahl leichtester Kante nötig ⇒ Priority Queue • Wir speichern nicht die Kanten selbst, sondern die Knoten v ∈V \ S. Priorität ist das Gewicht der Kante von S nach v DAP2 SS09 // S Unterbaumknoten, T Kanten Wähle e = (u, v), e verläßt S mit min. Gewicht 5 • Testen auf Kreise (Union-Find Partition) wie bei Kruskal nicht nötig Petra Mutzel i 8 while S ≠ V do { Knotenmenge S, Kantenmenge T: In Teilbaum Ti Petra Mutzel f 5 Petra Mutzel S := {s}; T := ø i 8 1 7 4 Wähle Startknoten s ∈ V g 7 e c e Schema: Algorithmus von Prim 11 9 s 2 d 7 Knotenmenge S, Kantenmenge T: In Teilbaum Ti Algorithmus von Prim b 2 12 g 11 9 s i 8 1 4 2 d 10 31 Petra Mutzel DAP2 SS09 32 4 02.07.2009 Pseudo-Code: Initialisierung G=(V, E), float w[E] Pseudo-Code Prim (7) while not Q.ISEMPTY() do // Graph und Gewichte // über alle Knoten (1) var π[V], PriorityQueue Q, pos[V] // π: Vorgänger in MST // pos: Position in Q (8) (p, u) := Q.EXTRACTMIN() (9) pos[u] := nil (2) for each u ∈ V \ {s} do { (10) for all e = (u,v) ∈ E(u) do { (3) pos[u] := Q.INSERT(∞, u) (11) (4) } (12) (5) pos[s] := Q.INSERT(0, s) (13) Q.DECREASEPRIORITY(pos[v], w(e)) (6) π[s] := nil (14) (15) } } } π[v] := u Petra Mutzel DAP2 SS09 33 // gewählten Knoten entfernen if pos[v] ≠ nil and // ausgehende Kanten // e verlässt S? w(e) < Q.PRIORITY(pos[v]) then { Petra Mutzel // günstiger? DAP2 SS09 34 Warum kann GreedyVerfahren funktionieren? Analyse • Aufbau des Heaps für PQ: in Θ(|V|) • |V| Durchläufe der while-Schleife mit EXTRACTMIN ⇒ O(|V| log |V|) • 2 Durchläufe der forall-Schleife für jede Kante • MST besteht aus Teilbäumen, die ebenfalls MSTs sind • Lokal beste Entscheidung (leichteste Kante) führt zu MST • max. |E| Aufrufe von DECREASEPRIORITY ⇒ O(|E| log |V|) Gesamtlaufzeit O(|E| log |V|), da |E|≥|V|-1 nächste VO: kürzeste Wege Algorithmen Petra Mutzel DAP2 SS09 35 Petra Mutzel DAP2 SS09 36 5