Randomisierte Algorithmen 8. Graph-Algorithmen Überblick Einleitung Minimale Schnitte Minimale aufspannende Bäume Überblick Einleitung Minimale Schnitte Minimale aufspannende Bäume 8.1 Definition (Multigraph) I ungerichteter Multigraph (V , E , v ) mit I I I I I Knotenmenge V der Größe n = |V | Kantenmenge E der Größe m = |E | Abbildung v : E → {{x, y } | x, y ∈ V } Es sind Mehrfachkanten möglich. In diesem Kapitel: keine Schlingen, also ∀e ∈ E : |v (e)| = 2. 8.3 Repräsentation von Multigraphen I I Adjazenzmatrix A der Größe n × n Eintrag A[x, y ] gibt an, wieviel Kanten zwischen x und y sind: A[x, y ] = |f −1 ({x, y })| außerdem nützlich: Vektor M der Größe n: Eintrag M[x] P gibt an, wieviele Kanten von x wegführen: M[x] = y A[x, y ] Überblick Einleitung Minimale Schnitte Minimale aufspannende Bäume 8.4 Definition Schnitte I I Ein Schnitt in einem Multigraphen ist eine Partitionierung V = C ∪ C̄ . Größe des Schnittes ist die Anzahl der Kanten {x, y } mit x ∈ C und y ∈ C̄ . MINCUT I I I Probleminstanz: ein Graph G Frage: Wie groß sind die minimalen Schnitte von G ? beste bekannte deterministische Algorithmen brauchen Laufzeit O(mn + n2 log n) ⊆ O(n3 ) I I für planare Graphen reicht O n(log n)2 randomisiert? 8.5 Lemma Wenn die Größe der minimalen Schnitte k ist, dann I I hat jeder Knoten mindestens Grad k ist die Anzahl Kanten m ≥ nk/2 8.6 Beweis I I Wäre anderenfalls deg(x) < k, dann hätte der Schnitt mit C = {x} eine Größe echt kleiner k. 8.7 Definition Kontraktion I I In Multigraph G seien Knoten x und y durch eine Kante e verbunden. Der durch Kontraktion der Kante e entstehende Multigraph G /e: I I Knotenmenge V 0 = (V r {x, y }) ∪ {z}, wobei z neu ist. Kantenmenge E 0 ergibt sich aus E , indem I I I alle Kanten zwischen x und y entfernt werden, jede Kante, die in G einen Knoten v ∈ V r {x, y } mit einem Knoten aus {x, y } verband, durch eine Kante zwischen v und z ersetzt wird und alle anderen Kanten von G übernommen werden. 8.8 Beispiel e1 v x e01 e e2 v z e02 y Es können Mehrfachkanten entstehen. 8.9 Lemma Minimale Schnitte von G /e sind mindestens so groß wie die von G . 8.10 Beweis I I I I I Betrachte minimalen Schnitt (K , K̄ ) von G /e. Seine Größe sei k. O. B. d. A. seien die Endknoten x und y von e in K . Indem man diese beiden Knoten aus der Kontraktion ” auspackt“ und in der gleichen Partition belässt, erhält man einen Schnitt von G , dessen Größe ebenfalls k ist. Also haben die minimalen Schnitte von G höchstens Größe k. 8.11 Algorithmus I I Sei G Multigraph mit Kante e zwischen x und y > x. Wie in 8.3 vereinbart, sei I I I I A Adjazenzmatrix“ P ” M Vektor mit M[x] = y A[x, y ] n, m Variablen für Knoten- bzw. Kantenzahl Die Datenstrukturen für G /e lassen sich wie folgt in Linearzeit berechnen: 8.11 Algorithmus (2) proc graph ← Kontraktion(graph G , edge e) hIdee: benutze x für z“ und y für n“i ” ” hAktualisierung der Kantenzahleni m ← m − A[x, y ] M[x] ← M[x] + M[y ] − 2 · A[x, y ] M[y ] ← M[n] hAktualisierung von Zeile/Spalte x:i A[x, ·] ← A[x, ·] + A[y , ·] A[·, x] ← A[·, x] + A[·, y ] A[x, x] ← 0 hAktualisierung von Zeile/Spalte y : i A[y , ·] ← A[n, ·] A[·, y ] ← A[·, n] hdie bisherige Zeile n ist nun bedeutungslosi n ←n−1 return hGraph, der zu den neuen Datenstrukturen gehörti 8.12 Algorithmus Iterierte Kontraktion hEingabe: ein Multigraph G (V , E )i hAusgabe: ein Schnitt (C , C̄ )i H ←G while (H hat mehr als 2 Knoten) do e ←hzufällig gleichverteilt gewählte Kante von Hi H ← Kontraktion(H, e) od (C , C̄ ) ← hdie Knotenmengen von G ,i hdie den Knoten von H entsprecheni 8.13 Satz Algorithmus 8.12 kann so implementiert werden, dass die Laufzeit in O(n2 ) ist. 8.14 Beweis I I I Jeder Aufruf von Kontraktion benötigt Laufzeit O(n). Bei jedem Schleifendurchlauf wird die Anzahl der Knoten von H um 1 erniedrigt, d. h. es gibt n − 2 solche Durchläufe. Es bleibt zu implementieren: 1. zufällige gleichverteilte Auswahl einer Kante des Multigraphen 2. Beschaffung der Mengen C und C̄ 8.14 Beweis (2) 1. Zufällige Kantenwahl: i ← random(1, 2m) hNB: jede Kante unten zweimal gezählt!i x ← 0; s ← 0 while s < i do x ←x +1 s ← s + M[x] od i ← i − (s − M[x]) y ← 0; s ← 0 while s < i do y ←y +1 s ← s + A[x, y ] od hWähle Kante zwischen x und y i 8.14 Beweis (3) 2. Beschaffung von C und C̄ : I I I I weitere Datenstruktur in der Prozedur Kontraktion boolesche Matrix Q mit so vielen Zeilen und Spalten wie der ursprüngliche Graph G Knoten hat. Q[x, y ] = 1: Knoten mit Ursprungsnummern x und y wurden kontrahiert. Initialisierung: Einheitsmatrix. I Q[x, ·] ← Q[x, ·] ∨ Q[y , ·] Q[y , ·] ← Q[n, ·] I Am Ende nur noch zwei Knoten: I I C z. B. durch 1-Einträge in Zeile 1 von Q gegeben C̄ z. B. durch 0-Einträge in Zeile 1 von Q gegeben 8.15 Satz Algorithmus 8.12 findet mit Wahrscheinlichkeit Ω(n−2 ) einen minimalen Schnitt. 8.16 Beweis in 3 Schritten 1. Es sei (C , C̄ ) irgendein Schnitt. Behauptung: Algorithmus 8.12 liefert genau dann diesen Schnitt als Ergebnis, wenn keine der Kanten, die über ihn läuft, während des Algorithmus kontrahiert wird. I I I Es sei e eine am Ende noch vorhandene Kante, die ursprünglich x und y verband. Dann ist nun etwa x ∈ C und y ∈ C̄ . Wäre die Kante e kontrahiert worden, müssten aber x und y am Ende zum gleichen Knoten von H gehören. 8.16 Beweis (2) 2. Es sei (K , K̄ ) ein minimaler Schnitt von G der Größe k. I I I Nach i − 1 Schleifendurchläufen sei noch keine Kante dieses Schnittes kontrahiert worden. Dann ist also (K , K̄ ) auch ein Schnitt des dann erhaltenen Graphen Hi−1 und wegen Lemma 8.9 muss es auch ein minimaler Schnitt sein. Also enthält Hi−1 noch mindestens (n − i + 1)k/2 Kanten. Folglich: I I Wahrscheinlichkeit, dass als nächstes eine der k Kanten, die zum Schnitt K gehören, kontrahiert wird, höchstens 2/(n − i + 1); Wahrscheinlichkeit, dass keine dieser Kanten kontrahiert wird, mindestens 1 − 2/(n − i + 1). 8.16 Beweis (3) 3. Die Wahrscheinlichkeit, dass in keinem der Schritte eine der Kanten des Schnittes K kontrahiert wird, ist daher mindestens Qn−2 n−2 Y (n − i − 1) 2 = Qi=1 1− n−2 n−i +1 i=1 (n − i + 1) i=1 = (n − 2)! n!/2! = (n − 2)!2! n! 2 1 > 2 ∈Ω 2 n n Bemerkung I I Die Nicht-Fehler-Wahrscheinlichkeit von 1/n2 in Satz 8.15 ist klein. Der kleinste von k = n2 /2 Schnitten ist mit W.keit 1 − 1/e minimal: I I I 2 1− 2 n n2 /2 < 1 e Weitere Rechnung zeigt: k ∈ Ω(n2 ) erzwungen. Gesamtlaufzeit: Θ(n4 ) im Gegensatz zu O(n3 ) im Deterministischen. Problem: Bei kleinen Graphen werden zu oft aus ” Versehen“ Kanten eines minimalen Schnittes kontrahiert. Besser: randomisiert auf t Knoten kontrahieren, Rest deterministisch. 8.17 Algorithmus proc graph ← IterContract(graph G , int t) hEingabe: ein Multigraph G (V , E , v ) undi h Endzahl t von Knoteni hAusgabe: ein kontrahierter Graph Hi H ←G while (H hat mehr als t Knoten) do e ←hzufällig gleichverteilt gewählte Kante von Hi H ← Kontraktion(H, e) od return H 8.18 Lemma Die Wahrscheinlichkeit, dass bei Algorithmus 8.17 im Ergebnis H noch ein minimaler Schnitt des ursprünglichen Graphen noch vorhanden“ ist, ist mindestens ” t n / . 2 2 8.19 Beweis Abschätzung analog wie in Beweis 8.16: n−t Y i=1 2 1− n−i +1 Qn−t (n − i − 1) = Qi=1 n−t i=1 (n − i + 1) = = Qn−t−2 (n − i − 1)t(t − 1) Qi=1 n−t n(n − 1) i=3 (n − i + 1) t(t − 1) n(n − 1) t n / ∈ Ω (t/n)2 = 2 2 8.20 Algorithmus proc cut ← IterContractDetMinCut(graph G , int t) hEingabe: ein Multigraph G (V , E , v ) undi h eine Knotenzahl ti hAusgabe: ein Schnitt von G i C ← hein trivialer Schnitti for i ← 1 to n2 /t 2 do H ← IterContract(G , t) D ← DetMinCut(H) C ← min(C , D) od return C 8.21 Lemma Wählt man in Algorithmus 8.20 t = n2/3 , dann ist die Laufzeit in O n8/3 und die Wahrscheinlichkeit, einen minimalen Schnitt von G zu erhalten mindestens 1 − 1/e. 8.22 Beweis I Zeitbedarf: n2 n4 2 3 · (n + t ) = + n2 t . t2 t2 I I Für gewähltes t beide Summanden größenordungsmäßig 8/3 in O n . Fehlerwahrscheinlichkeit höchstens n2 /t 2 t2 1 1− 2 < . n e 8.23 Algorithmus proc cut ← FastCut(graph G ) hEingabe: ein Multigraph G (V , E )i hAusgabe: ein Schnitt C i if (|V | ≤ 6) then C ← hminimaler Schnitt, deterministisch ermittelti else √ t ← d1 + n/ 2e H1 ← IterContract(G , t) H2 ← IterContract(G , t) C1 ← FastCut(H1 ) C2 ← FastCut(H2 ) fi C ← min(C1 , C2 ) 8.24 Satz Algorithmus 8.23 hat Laufzeit O(n2 log n). 8.25 Beweis I I I I Maximale Rekursionstiefe: Ω(log n). Beide Aufrufe von IterContract benötigen eine Zeit in O(n2 ). Also ist der Gesamtzeitbedarf T (n) für Eingabegraphen mit n Knoten l √ m T (n) = 2 · T 1 + n/ 2 + O n2 . Hieraus ergibt sich T (n) ∈ O(n2 log n). 8.26 Satz Algorithmus 8.23 liefert mit Wahrscheinlichkeit in Ω(1/ log n) minimalen Schnitt. 8.27 Beweis I I I I I G Eingabegraph mit minimalen Schnitten der Größe k Ein solcher Schnitt habe eine Reihe rekursiver Aufrufen von FastCut bis zu einer Stelle überlebt“. ” Der dann erreichte Graph heiße H. Durch Aufrufe von IterContract resultierenden Graphen H1 und H2 . Der Aufruf für H wird als Ergebnis einen minimalen Schnitt für G liefern, falls für ein Hi gilt: 1. Der Schnitt überlebt die Kontraktionen zur Konstruktion von Hi . 2. FastCut(Hi ) findet einen minimalen Schnitt in Hi . 8.27 Beweis (2) Die Wahrscheinlichkeit für Punkt 1 ist nach Lemma 8.17 mindestens √ √ √ √ d1 + t/ 2e(d1 + t/ 2e − 1) t/ 2 · t/ 2 1 t2 1 ≥ ≥ ≥ . t(t − 1) t(t − 1) 2 t(t − 1) 2 8.27 Beweis (3) Zu Punkt 2.: I I Interessieren uns für untere Schranke p(r ) der Wahrscheinlichkeit, dass FastCut r Niveaus über dem Rekursionsabbruch einen minimalen Schnitt findet. Z.B. so: p(0) = 1 und 2 1 p(r )2 p(r + 1) = 1 − 1 − · p(r ) = p(r ) − 2 4 I Einsetzen von q(r ) = 4/p(r ) − 1 bzw. p(r ) = 4/(q(r ) + 1) ergibt 4 4 4 4q(r ) = − = 2 q(r + 1) + 1 q(r ) + 1 (q(r ) + 1) (q(r ) + 1)2 I und weiter q(r + 1) = q(r ) + 1 + 1 . q(r ) 8.27 Beweis (4) I Induktion: Für alle r gilt: r < q(r ) < r + 3 + Hr −1 I I Offensichtlich ist q(0) = 3 und r < q(r ) für alle r . Weiter: r + 1 < q(r ) + 1 < q(r + 1) = q(r ) + 1 + 1 q(r ) < r + 3 + Hr −1 + 1 + 1 r = (r + 1) + 3 + Hr I I I Daher ist q(r ) ∈ r + O(log r ) und folglich p(r ) ∈ Ω(1/r ). Für Ausgangsgraphen mit n Knoten ist die Rekursionstiefe Θ(log n) folglich gesuchte Wahrscheinlichkeit Ω(1/ log n). Überblick Einleitung Minimale Schnitte Minimale aufspannende Bäume