15. Minimale Spannbäume Definition 15.1: 1. Ein gewichteter ungerichteter Graph (G,w) ist ein ungerichteter Graph G=(V,E) zusammen mit einer Gewichtsfunktion w : E → R . 2. Ist H=(U,F), U ⊆ V, F ⊆ E , ein Teilgraph von G, so ist das Gewicht w(H) von H definiert als w (H) = ∑ w (e ) e∈F ∈F SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 1 Minimale Spannbäume - Definition Definition 15.2: 1. Ein Teilgraph H eines ungerichteten Graphen G heißt Spannbaum von G, wenn H ein Baum auf den Knoten von G ist. 2. Ein Spannbaum S eines gewichteten ungerichteten Graphen G heißt minimaler Spannbaum von G, wenn S minimales Gewicht unter allen Spannbäumen von G besitzt. SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 2 Berechnung minimaler Spannbäume Ziel: Gegeben ein gewichteter ungerichteter Graph (G,w), G=(V,E). Wollen effizient einen minimalen Spannbaum von (G,w) finde. Vorgehensweise: Erweitern sukzessive eine Kantenmenge A ⊆ E zu einem minimalen Spannbaum 1. Zu Beginn A = { }. 2. Ersetzen in jedem Schritt A durch A ∪ {(u, v )} , wobei (u, v ) eine A-sichere Kante ist. 3. Solange bis A = V − 1 Definition 15.3: (u, v ) heißt A-sicher, wenn mit A auch A ∪ {(u, v )} zu einem minimalen Spannbaum erweitert werden kann. SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 3 Generischer MST-Algorithmus Generic − MST(G, w ) 1 A ←{ } 2 while A ist noch keine Spannbaum 3 do Finde eine A - sichere Kante (u, v ) 4 A ← A ∪ {(u, v )} 5 return A SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 4 Schnitte in Graphen Definition 15.4: 1. Ein Schnitt (C,V-C) in einem Graphen G=(V,E) ist eine Partition der Knotenmenge V des Graphen. 2. Eine Kante von G kreuzt einen Schnitt (C,V-C), wenn ein Knoten der Kante in C und der andere Knoten in V-C liegt. 3. Ein Schnitt (C,V-C) ist mit einer Teilmenge A ⊆ E verträglich, wenn kein Element von A den Schnitt kreuzt. 4. Eine (C,V-C) kreuzende Kante heißt leicht, wenn sie eine Kante minimalen Gewichts unter den (C,V-C) kreuzenden Kanten ist. SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 5 Schnitt in einem Graphen (1) b 4 S V-S 8 d 2 11 a c 7 i 7 8 h 4 6 14 9 e 10 1 g 2 f S V-S Schnittkanten SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 6 Charakterisierung sicherer Kanten Satz 15.5: Sei (G,w), G=(V,E) ein gewichteter ungerichteter Graph. Die Kantenmenge A ⊆ E sei in einem minimalen Spannbaum von (G,w) enthalten. Weiter sei (C,V-C) ein mit A verträglicher Schnitt und (u, v ) sei eine leichte (C,V-C) kreuzende Kante. Dann ist (u, v ) eine A-sichere Kante. Korollar 15.6: Sei (G,w), G=(V,E), ein gewichteter ungerichteter Graph. Die Kantenmenge A ⊆ E sei in einem minimalen Spannbaum von (G,w) enthalten. Ist (u, v ) eine Kante minimalen Gewichts, die eine Zusammenhangskomponente C von GA = (V, A ) mit dem Rest des Graphen G A verbindet, dann ist (u, v ) eine A-sichere Kante. SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 7 Beweis des Satzes - Illustration x p y u Knoten in C Kanten in A SS 2008 v Datenstrukturen und Algorithmen 15.Minimale Spannbäume 8 Algorithmus von Prim - Idee Zu jedem Zeitpunkt des Algorithmus besteht der Graph G A = (V, A ) aus einem Baum TA und einer Menge von isolierten Knoten IA . Eine Kante minimalen Gewichts, die einen Knoten in IA mit TA verbindet, wird zu A hinzugefügt. Die Knoten in IA sind in einem Min-Heap organisiert. Dabei ist der Schlüssel key[v] eines Knoten v ∈ IA gegeben durch das minimale Gewicht einer Kante, die v mit TA verbindet. SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 9 Algorithmus von Prim - Pseudocode Pr im − MST (G, w, r ) 1 for all v ∈ V 2 do key[v ] ← ∞ π [v ] ← NIL 3 4 key[r ] ← 0 5 Q ← Build - Min - Heap (V ) 6 while Q ≠ { } 7 do u ← Extract - Min (Q ) 8 for all v ∈ Adj[u ] 9 do if v ∈ Q ∧ w (u, v ) < key [v ] 10 then π [v ] ← u 11 key[v ] ← w (u, v ) 12 Decrease - Key(Q, v, key[v ]) SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 10 Heap-Decrease-Key Decrease-Key (H, v, key[v ]) ersetzt aktuellen Schlüssel von v durch neuen Wert key[v ]. Dabei muss der neue Schlüssel kleiner als der alte Schlüssel sein. Kann bei einem Heap mit n Elementen in Zeit O (log(n)) ausgeführt werden. SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 11 Algorithmus von Prim – Illustration (1) 4 8 b h i 7 h SS 2008 g c 2 7 f d 2 8 e 10 8 b 9 14 6 1 11 a d 4 i 7 8 4 7 2 11 a c 4 14 6 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 15.Minimale Spannbäume 12 Algorithmus von Prim – Illustration (2) 4 8 b h i 7 h SS 2008 g c 2 7 f d 2 8 e 10 8 b 9 14 6 1 11 a d 4 i 7 8 4 7 2 11 a c 4 14 6 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 15.Minimale Spannbäume 13 Algorithmus von Prim – Illustration (3) 4 8 b h i 7 h SS 2008 g c 2 7 f d 2 8 e 10 8 b 9 14 6 1 11 a d 4 i 7 8 4 7 2 11 a c 4 14 6 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 15.Minimale Spannbäume 14 Algorithmus von Prim – Illustration (4) 4 8 b h i 7 h SS 2008 g c 2 7 f d 2 8 e 10 8 b 9 14 6 1 11 a d 4 i 7 8 4 7 2 11 a c 4 14 6 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 15.Minimale Spannbäume 15 Algorithmus von Prim – Illustration (5) 4 c 7 d 2 11 a i 7 8 h SS 2008 8 b 4 14 6 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 15.Minimale Spannbäume 16 Algorithmus von Prim – Laufzeit Zeile 7 pro Durchlauf O (log( V )), wird V -mal durchlaufen. Zeilen 8-12 pro Durchlauf O (log( V )) (für HeapDecrease-Key). Zeilen 9-12 2 E -mal durchlaufen, da Größe aller Adjazenzlisten zusammen genau 2 E . Satz 15.7: Der Algorithmus von Prim berechnet in Zeit O ( V log( V ) + E log( V )) einen minimalen Spannbaum eines gewichteten ungerichteten Graphen (G,w), G=(V,E). Mit Fibonacci-Heaps Verbesserung auf O ( V log( V ) + E ) möglich. SS 2008 Datenstrukturen und Algorithmen 15.Minimale Spannbäume 17 Algorithmus von Kruskal – Idee (1) Kruskals Algorithmus berechnet minimale Spannbäume, allerdings mit anderer Strategie als Prims Algorithmus. Kruskals Algorithmus erweitert sukzessive Kantenmenge A zu einem Spannbaum. Zu jedem Zeitpunkt besteht G A = (V, A ) aus einer Menge von Bäumen. Eine Kante minimalen Gewichts, die in G A keinen Kreis erzeugt, wird zu A in jedem Schritt hinzu gefügt. SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 18 Algorithmus von Kruskal – Idee (2) Solch eine Kante muss zwei Bäume in GA verbinden. Korrektheit folgt dann aus Satz 15.5 und Korollar 15.6. SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 19 Charakterisierung sicherer Kanten Satz 15.5: Sei (G,w), G=(V,E) ein gewichteter ungerichteter Graph. Die Kantenmenge A ⊆ E sei in einem minimalen Spannbaum von (G,w) enthalten. Weiter sei (C,V-C) ein mit A verträglicher Schnitt und (u, v ) sei eine leichte (C,V-C) kreuzende Kante. Dann ist (u, v ) eine A-sicher Kante. Korollar 15.6: Sei (G,w), G=(V,E), ein gewichteter ungerichteter Graph. Die Kantenmenge A ⊆ E sei in einem minimalen Spannbaum von (G,w) enthalten. Ist (u, v ) eine Kante minimalen Gewichts, die eine Zusammenhangskomponente C von GA = (V, A ) mit dem Rest des Graphen G A verbindet, dann ist (u, v ) eine A-sichere Kante. SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 20 Algorithmus von Kruskal - Datenstruktur Kruskals Algorithmus benötigt Datenstruktur mit deren Hilfe 1. Für jede Kante (u, v ) ∈ E effizient entschieden werden kann, ob u und v in derselben ZusamMenhangskomponente von G A liegen. 2. Zusammenhangskomponenten effizient verschmolzen werden können. Solch eine Datenstruktur ist Union-Find-Datenstruktur für disjunkte dynamische Mengen. SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 21 Disjunkte dynamische Mengen (1) Gegeben ist eine Menge U von Objekten. Verwaltet wird immer eine Familie {S1, S 2 ,K, Sk } von disjunkten Teilmengen von U. Teilmengen Si werden identifiziert mit Hilfe eines Elements aus Si , einem so genannten Repräsentanten. SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 22 Disjunkte dynamische Mengen (2) Die folgenden Operationen sollen unterstützt werden: 1. Make-Set(x). erzeugt Teilmenge {x} mit Repräsentant x. 2. Union(x,y): vereinigt die beiden Teilmengen, die x bzw, y enthalten. 3. Find-Set(x): liefert den Repräsentanten derjenigen Menge, die x enthält. SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 23 Union-Find mit verketteten Listen Realisierung einer Datenstruktur für disjunkte dynamische Menge kann mit verketteten Listen erfolgen: 1. Für jede Teilmenge S gibt es eine verkettete Liste S der Objekte in S. 2. Repräsentant ist dabei das erste Objekt der Liste. 3. Zusätzlich head [S ] und tail [S ] Verweise auf erstes bzw. letztes Element der Liste. Feld size [S ] speichert Größe der Liste. 4. Für jedes Element x der Liste Verweis rep [x ] auf Repräsentanten der Liste. SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 24 Union-Find mit verketteten Listen - Illustration c h head e b / tail SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 25 Operationen Make-Set und Find-Set Make-Set: Erzeugen einer 1-elementigen Liste möglich in Zeit O (1). Find-Set(x): Ausgabe des Repräsentaten rep[x ] möglich in Zeit O (1) SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 26 Operation Union Union(x,y): Sx enthalte x und Sy enthalte y. 1. Bestimmen, welche der Listen kürzer ist. 2. Hänge kürzere Liste an längere Liste. 3. Ersetze Repräsentanten für die Elemente der kürzeren Liste. Lemma 15.8: Die Operation Union kann in Zeit proportional zur Länge der kürzeren Liste durchgeführt werden. SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 27 Analyse vieler Operationen Satz 15.8: Werden verkettete Listen als Union-FindDatenstruktur benutzt und werden insgesamt m Operationen Make-Set, Find-Set und Union ausgeführt, von denen n Operationen Make-Set Operationen sind, so können alle Operationen zusammen in Zeit O (m + n log(n)) ausgeführt werden. SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 28 Kruskals Algorithmus und Union-Find Benutzen Union-Find-Datenstruktur, um Zusammenhangskomponenenten von G A = (V, A ) zu verwalten. Test, ob (u,v) zwei verschiedene Zusammenhangskomponenten verbindet durch Test, ob Find-Set(u)=Find-Set(v). Verschmelzen von Zusammenhangskomponenenten durch Union. SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 29 Algorithmus von Kruskal - Pseudocode Kruskal − MST(G, w ) 1 A ←{ } 2 for alle v ∈ V 3 do Make - Set (v ) 4 Sortiere die Kanten von G nach aufsteigen dem Gewicht. 5 for alle Kante (u, v) von G in der Reihenfolg e aufsteigen den Gewichts 6 do if Find - Set (u) ≠ Find - Set (v ) 7 then A ← A ∪ {(u, v )} 8 Union(u, v ) 9 return A SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 30 Algorithmus von Kruskal – Illustration (1) 4 8 b h i 7 h SS 2008 g c 2 7 f d 2 8 e 10 8 b 9 14 6 1 11 a d 4 i 7 8 4 7 2 11 a c 4 14 6 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 15. Minimale Spannbäume 31 Algorithmus von Kruskal – Illustration (2) 4 8 b h i 7 h SS 2008 g c 2 7 f d 2 8 e 10 8 b 9 14 6 1 11 a d 4 i 7 8 4 7 2 11 a c 4 14 6 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 15. Minimale Spannbäume 32 Algorithmus von Kruskal – Illustration (3) 8 b 4 g 8 c f 2 7 d 2 11 i 7 h e 10 1 b 8 SS 2008 9 14 6 7 h a d 4 i 8 4 c 2 11 a 7 4 14 6 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 15. Minimale Spannbäume 33 Algorithmus von Kruskal – Illustration (4) 8 b 4 h i 7 h SS 2008 g c f 2 7 d 2 8 e 10 8 b 9 14 6 1 11 a 4 i 7 8 4 d 2 11 a c 7 4 14 6 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 15. Minimale Spannbäume 34 Laufzeitanalyse von Kruskals Algorithmus Satz 15.9: Werden verkettete Listen als Union-FindDatenstruktur benutzt, so ist die Laufzeit von Kruskals Algorithmus O ( V log( V ) + E log(E )). SS 2008 Datenstrukturen und Algorithmen 15. Minimale Spannbäume 35