Wiederholung – Kürzeste Wege Dijkstras Algorithmus • Kürzeste Wege von einem Knoten und mit positiven Kantengewichten • Laufzeit O((|V|+|E|) log |V|) • Bessere Laufzeit von O(|V| log |V| + |E|) möglich mit besseren Prioritätenschlangen Fragen: • Was passiert bei negativen Kantengewichten? • Wie kann man das kürzeste Wege Problem für alle Paare von Knoten effizient lösen? SS 2010 Datenstrukturen und Algorithmen 1 1 Kürzeste Wege Das transitive Hülle Problem: • Gegeben sei ein gerichteter, ungewichteter Graph G=(V,E) • Gesucht: Die transitive Hülle G*=(V,E*) von G, wobei E*={(u,v): es gibt Weg von u nach v in G} G SS 2010 G* Datenstrukturen und Algorithmen 2 2 Kürzeste Wege Das transitive Hülle Problem: • Gegeben sei ein gerichteter, ungewichteter Graph G=(V,E) • Gesucht: Die transitive Hülle G*=(V,E*) von G, wobei E*={(u,v): es gibt Weg von u nach v in G} Transitive Hülle: • In O(|V|²+|V| |E|) Zeit mit Breiten- oder Tiefensuche von jedem Knoten • Geht das auch schneller? SS 2010 Datenstrukturen und Algorithmen 3 3 Kürzeste Wege Graphen und Matrixmultiplikation: • Sei A die n×n-Adjazenzmatrix von Graph G mit Knotenmenge {1,…,n} • Was ist A⋅A? Behauptung 14.15: Sei Z= A⋅A. Dann gilt z ij >0, g.d.w. es in G einen Pfad der Länge 2 von Knoten i zu Knoten j gibt. SS 2010 Datenstrukturen und Algorithmen 4 4 Kürzeste Wege Behauptung 14.16: Sei Z‘= A⋅A + A. Dann gilt, dass z‘ij >0, g.d.w. es einen Weg der Länge 1 oder 2 von Knoten i zu Knoten j gibt. Konstruiere Matrix B mit: • bij =1 ⇔ z‘ij >0 Behauptung 14.17: Matrix B hat einen Weg von Knoten i nach j, g.d.w. Matrix A einen solchen Weg hat. SS 2010 Datenstrukturen und Algorithmen 5 5 Kürzeste Wege Behauptung 14.18: Sei P ein Weg der Länge k>1 in G. Dann hat P maximal Länge 2/3 k in dem von Matrix B beschriebenen Graph G‘. Konsquenz aus Beh. 14.17 und 14.18: • Wenn wir die Berechnung von B log 3/2 n mal iterieren, haben wir die transitive Hülle berechnet SS 2010 Datenstrukturen und Algorithmen 6 6 Kürzeste Wege TransitiveHülle(A) 1. for i←1 to log 3/2 n do 2. Z‘ ← A A+A 3. for i←1 to n do 4. for j←1 to n do 5. if z‘ij >0 then bij ←1 else bij ←0 6. A←B 7. return A SS 2010 Datenstrukturen und Algorithmen 7 7 Kürzeste Wege Satz 14.19: Der Algorithmus TransitiveHülle berechnet die transitive Hülle eines Graphen G in O(M(n) log n) Zeit, wobei M(n) die Laufzeit zur Matrixmultiplikation bezeichnet. SS 2010 Datenstrukturen und Algorithmen 8 8 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 SS 2010 Datenstrukturen und Algorithmen 9 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 2010 Datenstrukturen und Algorithmen 10 Illustration von minimalen Spannbäumen (1) a 2 3 b 2 c a 1 3 c a 1 d 2 b 2 3 c Spannbaum für G (minimal) SS 2010 d Spannbaum für G (minimal) b 2 1 c Graph G=(V,E) a b 3 d 4 2 d Spannbaum für G (nicht minimal) Datenstrukturen und Algorithmen 11 Illustration von minimalen Spannbäumen (2) 4 b c 7 d 2 11 a i 7 8 h SS 2010 8 4 14 6 9 e 10 1 g 2 Datenstrukturen und Algorithmen f 12 Berechnung minimaler Spannbäume Ziel: Gegeben ein gewichteter ungerichteter Graph (G,w), G=(V,E). Wir wollen effizient einen minimalen Spannbaum von (G,w) finden. 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 2010 Datenstrukturen und Algorithmen 13 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 2010 Datenstrukturen und Algorithmen 14 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 2010 Datenstrukturen und Algorithmen 15 Schnitt in einem Graphen (1) b 4 S V-S 8 7 d 2 11 a c i 7 8 h 4 14 6 9 e 10 1 g 2 f S V-S Schnittkanten SS 2010 Datenstrukturen und Algorithmen 16 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 2010 Datenstrukturen und Algorithmen 17 Beweis des Satzes - Illustration • Betrachte beliebigen MSB T´, der A enthält • (C,V-C): mit A verträglicher Schnitt • e={s,t}: (C,V-C)-Kante minimaler Kosten (e∉A) s C e e´ t V-C in T´ • Ersetzung von e´ durch e führt zu Baum T, der e und A enthält und höchstens Kosten von MSB T´ hat, also MSB ist SS 2010 Datenstrukturen und Algorithmen 18 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 2010 Datenstrukturen und Algorithmen 19 Algorithmus von Prim - Pseudocode Pr im − MST (G, w, r ) 1 for all v ∈ V 2 do key[v ] ← ∞ 3 π [v ] ← NIL 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 2010 Datenstrukturen und Algorithmen 20 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 2010 Datenstrukturen und Algorithmen 21 Algorithmus von Prim – Illustration (1) 4 8 b h i 7 h SS 2010 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 22 Algorithmus von Prim – Illustration (2) 4 8 b h i 7 h SS 2010 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 23 Algorithmus von Prim – Illustration (3) 4 8 b h d 14 g e c 2 7 f d 2 i 7 h 9 10 8 b 8 SS 2010 6 1 11 a 4 i 7 8 4 7 2 11 a c 4 6 14 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 24 Algorithmus von Prim – Illustration (4) 4 8 b h i 7 h SS 2010 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 6 14 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 25 Algorithmus von Prim – Illustration (5) 4 c 7 d 2 11 a i 7 8 h SS 2010 8 b 4 6 14 9 e 10 1 g 2 f Datenstrukturen und Algorithmen 26 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 Decrease-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 2010 Datenstrukturen und Algorithmen 27 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 2010 Datenstrukturen und Algorithmen 28 Algorithmus von Kruskal – Idee (2) Solch eine Kante muss zwei Bäume in G A verbinden. Korrektheit folgt dann aus Satz 15.5 und Korollar 15.6. SS 2010 Datenstrukturen und Algorithmen 29 Zur Erinnerung 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 G A = (V, A ) mit dem Rest des Graphen G A verbindet, dann ist (u, v ) eine A-sichere Kante. SS 2010 Datenstrukturen und Algorithmen 30 Algorithmus von Kruskal – Illustration 1 3 2 3 2 2 5 2 1 SS 2010 4 3 Datenstrukturen und Algorithmen 31 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 GA liegen. 2. Zusammenhangskomponenten effizient verschmolzen werden können. Solch eine Datenstruktur ist Union-Find-Datenstruktur für disjunkte dynamische Mengen. SS 2010 Datenstrukturen und Algorithmen 32 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 2010 Datenstrukturen und Algorithmen 33 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 2010 Datenstrukturen und Algorithmen 34 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 2010 Datenstrukturen und Algorithmen 35 Union-Find mit verketteten Listen - Illustration c h head e b / tail SS 2010 Datenstrukturen und Algorithmen 36 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 2010 Datenstrukturen und Algorithmen 37 Operation Union Union(x,y): Sx enthalte x und Sy enthalte y. 1. Bestimme, 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 2010 Datenstrukturen und Algorithmen 38 Analyse vieler Operationen Satz 15.8: Werden verkettete Listen als Union-FindDatenstruktur benutzt und werden insgesamt n Make-Set und Union Operationen und m Find-Set Operationen ausgeführt, so können alle Operationen zusammen in Zeit O (m + n log(n)) ausgeführt werden. SS 2010 Datenstrukturen und Algorithmen 39 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 2010 Datenstrukturen und Algorithmen 40 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 Reihenfolge aufsteigenden Gewichts 6 do if Find - Set (u) ≠ Find - Set (v ) 7 then A ← A ∪ {(u, v )} 8 Union(u, v ) 9 return A SS 2010 Datenstrukturen und Algorithmen 41 Algorithmus von Kruskal – Illustration (1) 4 8 b h i 7 h SS 2010 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 42 Algorithmus von Kruskal – Illustration (2) 4 8 b h i 7 h SS 2010 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 43 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 2010 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 44 Algorithmus von Kruskal – Illustration (4) 8 b 4 h i 7 h SS 2010 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 45 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 2010 Datenstrukturen und Algorithmen 46