1 Algorithmen und Datenstrukturen Wintersemester 2014/15 20. Vorlesung Minimale Spannbäume Prof. Dr. Alexander Wolff Lehrstuhl für Informatik I ? Motivation ) Kantengewichte w : E → R≥0 P ?? 0 ) w (E ) := e ∈E 0 w (e ) Gegeben: zusammenhängendes Straßennetz G = (V , E ; w ?), das eine Menge V von n Städten verbindet Gesucht: Teilnetz G 0 = (V , E 0 ) mit E 0 ⊆ E , so dass (1) man von jeder Stadt in G 0 zu jeder anderen kommen kann ( G 0 spannt G auf“) und ” (2) die Schneeräumkosten“ w (E 0 )?? minimal ” sind unter allen Teilnetzen, die (1) erfüllen. E0 ⊆ E G = (V , E ; w ) n z.B. mit w ≡ euklid. Abstände 2 3 Beobachtung Wegen der Minimalität von w (E 0 ) gilt: G 0 hat keine Kreise ⇒ G 0 ist ein Wald. G 0 erbt“ Zusammenhang von G ⇒ G 0 Baum. ” G 0 spannt G auf ⇒ G 0 ist Spannbaum von G . G 0 hat minimales Gewicht unter allen Spannbäumen von G . 0 Wir nennen G Spannbaum von G . z }|kurz minimalen { (manchmal auch E 0 ) E0 ⊆ E Beob. |E 0 | = |V | − 1 G = (V , E ; w ) n z.B. mit w ≡ euklid. Abstände 4 Generischer Min.-Spannbaum-Algorithmus GenericMST(UndirectedConnectedGraph G , EdgeWeights w ) A=∅ while |A| < |V | − 1 do // Invariante: A ist Teilmenge eines min. Spannbaums von G finde Kante uv , die sicher für A ist A = A ∪ {uv } Wir sagen uv ist sicher für A, return A falls Invariante für A ∪ {uv } gilt. Beob. Dies ist ein sogenannter Greedy-Algorithmus! Frage: Gibt’s überhaupt immer eine sichere Kante? Antwort: Ja! – Per Induktion! Frage: Aber wie findet man eine – ohne schon einen minimalen Spannbaum zu kennen? 5-3 Schnitte und leichte Kanten Def. Ein Schnitt (S , V \ S ) eines ungerichteten Graphen G = (V , E ) ist eine Zerlegung (od. Zweifärbung?) von V. S ? V \S ) benachbarte Knoten dürfen hier die gleiche Farbe haben. 5-6 Schnitte und leichte Kanten Def. Ein Schnitt (S , V \ S ) eines ungerichteten Graphen G = (V , E ) ist eine Zerlegung (od. Zweifärbung?) von V. Eine Kante e kreuzt (S , V \ S ), wenn ein Endpunkt von e in S und der andere in V \ S liegt. V \S S 5-9 Schnitte und leichte Kanten Def. Ein Schnitt (S , V \ S ) eines ungerichteten Graphen G = (V , E ) ist eine Zerlegung (od. Zweifärbung?) von V. Eine Kante e kreuzt (S , V \ S ), wenn ein Endpunkt von e in S und der andere in V \ S liegt. Ein Schnitt respektiert eine Kantenmenge A, wenn keine Kante in A den Schnitt kreuzt. V \S S 5-14 Schnitte und leichte Kanten Def. Ein Schnitt (S , V \ S ) eines ungerichteten Graphen G = (V , E ) ist eine Zerlegung (od. Zweifärbung?) von V. Eine Kante e kreuzt (S , V \ S ), wenn ein Endpunkt von e in S und der andere in V \ S liegt. Ein Schnitt respektiert eine Kantenmenge A, wenn keine Kante in A den Schnitt kreuzt. Eine Kante e , die einen Schnitt kreuzt, ist leicht, wenn alle Kanten, die den Schnitt kreuzen, mindestens w (e ) wiegen. 7 2 3 5 2 5 V \S 4 3 3 3 6 4 S 3 6 Erweiterungssatz Sei G = (V , E ; w ) ein zshg., gewichteter, unger. Graph. Satz. Sei T Kantenmenge eines min. Spannbaums von G . Sei A Teilmenge von T . Sei (S , V \ S ) ein Schnitt, der A respektiert. Sei uv ∈ E leicht bzgl. (S , V \ S ). Dann ist uv sicher für A., d.h. G hat einen min. Spannbaum, der A ∪ {uv } enthält. 7 2 3 5 2 5 A 3 3 v 4 3 u 3S 6 3 7 Beweis Satz. . . . Dann ist uv sicher für A. Beweis. Zeige: G hat min. Spannbaum, der A ∪ {uv } enthält. Falls uv ∈ T, fertig. Also uv 6= T. Sei π u -v -Pfad in T. ⇒ π + uv ist Kreis (wobei uv (S , V \ S ) kreuzt) ⇒ Kreis enthält zweite Kante xy , die (S , V \ S ) kreuzt. ⇒ T 0 = (T ∪ {uv }) \ {xy } ist auch Spannbaum von G. w (T 0) = w (T ) + w (uv ) − w (xy ) ≤ w (T ) | {z } ≤ 0, da uv leicht bzgl. (S , V \ S ) 7 π ⇒ T 0 ist minimaler 2 3 4 Spannbaum von G . x 2 y 5 5 3 Und: A ∪ {uv } ⊆ T 0 . u 3S 3 3 3 ⇒ uv ist sicher f ür A . 6 A T v 8 Zurück zum Algorithmus Satz. Sei G = (V , E ; w ) ein zshg., gewichteter, unger. Graph. Sei T Kantenmenge eines min. Spannbaums von G . Sei A Teilmenge von T . Sei (S , V \ S ) ein Schnitt, der A respektiert. Sei uv ∈ E leicht bzgl. (S , V \ S ). Dann ist uv sicher für A. GenericMST(UndirectedConnectedGraph G , EdgeWeights w ) A=∅ while |A| < |V | − 1 do // INV: A ⊆ min. Spannbaum von G finde Kante uv , die sicher für A ist A = A ∪ {uv } return A 9 Zusammenhangskomponenten Def. Eine Zusammenhangskomponente eines Graphen ist ein Teilgraph, der von einer nicht vergrößerbaren ( inklusionsmaximalen“) ” zusammenhängenden Menge von Knoten induziert wird. A C u v GA Korollar. G = (V , E ) wie gehabt. A ⊆ E in einem min. Spannbaum von G enthalten. C = (VC , EC ) Zshgskomp. des Waldes GA = (V , A) . uv leicht bzgl. (VC , V \ VC ) Dann gilt: uv ist sicher für A. 10 Der Algorithmus von Jarnı́k-Prim (1930/1957) Jarnı́kPrimMST Undirected Dijkstra(WeightedGraph G = (V , E ; w ), Vertex s ) Initialize(G , s ) Q = new PriorityQueue(V , d ) // Gewichtung 7 while not Q .Empty() do 3 3 u = Q .ExtractMin() s 2 foreach v ∈ Adj[u ] do 0 5 2 3 0 Relax (u , v ; w ) 3 3 v ∈ Q and ... 0 6 3 Korrektheit? X 2 3 2 4 5 3 3 3 3 Folgt aus Korollar: A = {{u, u.π} : u 6∈ Q}, Kante {u, u.π} immer sicher bzgl. (Q ? , V \Q ? ), wobei Q ? = Q ∪ {u}. Relax (u , v ; w ) if v .d > u .d + w (u , v ) then Laufzeit? v .d = u .d + w (u , v ) O (|E |·DecreaseKey+|V |·ExtractMin) v .π = u ⇒ O ((E + V ) log V ) [Heap/RS-Baum] Q .DecreaseKey(v , v .d ) ⇒ O (E + V log V ) [Fibonacci-Heap] 11 Einschub: halbdynamische Mengen (wachsen nur, schrumpfen nicht) Die halbdyn. Mengen zerlegen immer eine Grundmenge X . Drei Operationen: MakeSet(Element x ) legt die Menge {x } an. x FindSet(Element x ) x liefert (Zeiger auf) die Menge zurück, die momentan x enthält. Union(Elem. x , Elem. y ) vereinigt die Mengen, die momentan x und y enthalten. y x Satz. Eine Folge von m MakeSet-, Union- und FindSet-Oper., von denen n MakeSet-Oper. sind, benötigt O (m · α(n)) Zeit, wobei α(n) ≤ 4 für alle n ≤ 1080 . Insbesondere α(n) log n für n > 1. funktionales Inverses der extrem schnellwachsenden Ackermann-Funktion A(n, n) 12 Der Algorithmus von Kruskal KruskalMST(WeightedUndirectedGraph G = (V , E ; w )) A=∅ foreach v ∈ V do MakeSet(v ) Sortiere E nicht-absteigend nach Gewicht w foreach uv ∈ E do if FindSet(u ) 6= FindSet(v ) then A = A ∪ {uv } Union(u , v ) 7 Laufzeit? |V |·MakeSet + (|V | − 1)·Union + 2|E |·FindSet + Sort(E ) ∈ O (E log V + E log E ) = O (E log V ) ! Warum?? 2 3 5 2 5 3 3 4 3 3 3 6 O (log E ) ⊆ O (log V 2 ) = O (log V ) Ah. . . 13 Übersicht Algorithmen für min. Spannbäume Jarnı́k-Prim Kruskal geht (wie Dijkstra / BFS) wellenförmig von einem Startknoten aus bearbeitet Kanten nach aufsteigendem (genauer: nicht-absteig.) Gewicht aktuelle Kantenmenge zusammenhängend nach Einfügen der i . Kante gibt es n − i Zshgskomp. Laufzeit O (E + V log V ) Laufzeit O (E log V ) s