7. Graphenalgorithmen Grundlagen: 1. Paar (V, E) heißt gerichteter Graph G, wobei V endl. Menge von Knoten und E ⊆ V × V eine endl. Menge von Kanten ist. 2 Element e = (v,w) ∈ E 1 3 heißt Kante von v nach w („ v w “) v ist Startknoten von e 5 w ist Zielknoten von e w ist Nachbarknoten von v (w ist adjazent zu v) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 4 1 2. Pfad in G ist Folge (v0, ..., vk) von Knoten mit k ≥ 0 und (vi, vi+1) ∈ E für 0 ≤ i ≤ k − 1. Länge des Pfades ist k. Falls v0 = vk und k ≥ 1, so heißt der Pfad Kreis bzw. Zyklus. Falls vi ≠ v j für alle i ≠ j , so heißt der Pfad einfach. Falls es Pfad von v nach w in G gibt, so schreibt man * v → w. G Gerichteter Graph heißt zyklisch, falls er Kreis enthält; sonst azyklisch. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 2 7.1 Darstellung von Graphen Annahme: V = {1, 2, ..., n}, G = (V, E), n = |V|. Zwei Darstellungsarten sind üblich: 1. Darstellung: Adjazenzmatrix A = (aij ) , 1 ≤ i,j ≤ n 1 , aij := 0 , Bsp.: falls (i,j ) ∈ E sonst. 1 2 3 4 5 1 4 2 5 3 Vorlesung Algorithmen (RN/MK/AZ) 1 2 3 4 5 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 WSI für Informatik, Universität Tübingen 1 1 0 0 0 3 Bei ungerichteten Graphen ist die Adjazenzmatrix symmetrisch: 1 4 2 5 3 1 2 3 4 5 1 2 3 4 5 Vorlesung Algorithmen (RN/MK/AZ) falls {i,j}∈ E sonst. 1 , hier: aij := 0 , 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 WSI für Informatik, Universität Tübingen 4 Platzbedarf: O(n2) ist günstig, falls m := E ≈ n 2 . Aber: Oft sind Graphen dünn, d.h. m ≈ O (n ) . Bsp.: Zahl der Kanten in Bäumen mit n Knoten ist n – 1. Planare Graphen: Graph heißt planar, falls er in Ebene gezeichnet werden kann, ohne dass sich Kanten überkreuzen. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 5 Zwei nicht-planare, ungerichtete Graphen: K3,3 K5 („vollständiger“ bipartiter Graph mit 3 und 3 Knoten) Mitteilung: Ein planarer Graph mit n>2 Knoten enthält maximal 3n – 6 Kanten. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 6 2. Darstellung: Adjanzenzlisten Speichere für jeden Knoten v seine „Nachbarn“: G = (V, E) gerichtet: InAdj(v ) = { w ∈ V (w, v ) ∈ E} OutAdj(v ) = { w ∈ V (v, w) ∈ E} G ungerichtet: Adj(v ) = { w ∈ V Vorlesung Algorithmen (RN/MK/AZ) {v,w}∈ E} WSI für Informatik, Universität Tübingen 7 Im vorigen Beispiel (gerichtet): InAdj: 1 2 3 4 5 2 OutAdj: 5 1 2 1 2 3 4 5 5 1 5 3 Platzbedarf: O(n + m) Nachteil: Zugriffszeit auf Kante abhängig von Listenlänge, d.h. Knotengrad: Eingangsgrad indeg(v) eines Knoten v = { (w, v ) (w, v ) ∈ E} , Ausgangsgrad outdeg(v) eines Knoten v = { (v, w) (v, w) ∈ E} (analog für ungerichtete Graphen). Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 8 Graph G = (V, E) heißt Baum, falls a) V enthält genau einen Knoten v0 mit indeg(v0) = 0. b) ∀ v ∈ V \ {v0 }: indeg (v ) = 1 c) G ist azyklisch. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 9 7.2 Topologisches Sortieren Sei G = (V, E) gerichteter Graph. Abbildung num: V {1, ..., n} mit n = |V| heißt topologische Sortierung von G, falls num(v) < num(w) für alle (v, w) ∈ E . Bsp.: 1 4 2 5 3 2 num: 1 1 2 1 2 Vorlesung Algorithmen (RN/MK/AZ) 5 3 3 4 4 5 3 es gibt keine topologische Sortierung! WSI für Informatik, Universität Tübingen 10 Lemma: Gerichteter Graph G = (V, E) besitzt genau dann eine topologische Sortierung, wenn G azyklisch ist. Beweis: "⇒" : Sei G zyklisch. Dann ist etwa (v0, ..., vk), k ≥ 1, ein Kreis. Für eine topologische Sortierung muss aber gelten: num(v0) < num(v1) < ... < num(vk) = num(v0). Widerspruch!! Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 11 "⇐" : Sei G azyklisch. Beh.: G enthält Knoten v mit indeg(v) = 0. Wir finden solchen Knoten v wie folgt. Starte mit bel. Knoten w und gehe entlang eingehender Kanten „rückwärts“. Da Graph azyklisch und endlich, wird kein Knoten auf diesem „Rückweg“ zweimal besucht und daher terminiert dieser Prozess mit einem Knoten v mit indeg(v) = 0. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 12 Jetzt zur topologischen Sortierung: Beweis per Induktion über Knotenzahl: |V| = 1: trivial. |V| > 1: Wähle (gemäß Beh.) v mit indeg(v) = 0. Entferne v und sortiere den Restgraph G´ topologisch induktiv, d.h.: Sei num´ : V´ {1, ..., |V´|} top. Sortierung für G´. Dann ergibt sich die top. Sort. num durch num´(w) + 1, num(w) = 1, Vorlesung Algorithmen (RN/MK/AZ) falls w ≠ v falls w = v. WSI für Informatik, Universität Tübingen 13 Grundalgorithmus für topologisches Sortieren: count 0; while ∃ v ∈ V mit indeg(v) = 0 do count ++; num(v) count; streiche v und alle von v ausgehenden Kanten aus G; od if count < |V| then ausgabe(G zyklisch!) fi Komplexitätsanalyse: Problem: Test auf Existenz eines Knotens v mit indeg(v) = 0. Lösung: Merke alle Knoten mit indeg = 0 in Menge ZERO. Führe für jeden Knoten Buch über Anzahl jeweils einmündender Kanten. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 14 Algorithmus TOPSORT: (1) ZERO Ø; (2) for all v ∈ V do INDEG[v] 0 od; (3) for all e ∈ E do INDEG[target(e)] ++ od; (4) for all v ∈ V do (5) if INDEG[v] = 0 then ZERO ZERO ∪ {v} fi (6) od (7) count Fortsetzung 0; nächste Folie Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 15 (8) while ZERO ≠ Ø do (9) wähle und streiche v ∈ ZERO ; (10) count ++; (11) num[v] (12) count; for all (v, w) ∈ E do (13) INDEG[w] – – ; (14) if INDEG[w] = 0 then ZERO (15) ZERO ∪ {w} fi od (16) od; (17) if count < |V| then ausgabe(G zyklisch!) fi Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 16 Satz: Topologische Sortierung eines gerichteten Graphen G = (V, E) kann in Zeit O(n + m) (Linearzeit!) berechnet werden. Hierbei: n = |V|, m = |E|. Beweis: Die Korrektheit folgt unmittelbar mit dem Lemma. Zur Komplexität: Übungsaufgabe! Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 17 7.3 Kürzeste/Billigste Wege in Graphen Sei G = (V, E) gerichteter Graph mit Kostenfunktion c: E R, ein sogenanntes Netzwerk. Sei p = (v0, ..., vk) Pfad von v0 = v nach vk = w. Dann heißt k −1 c( p ) := ∑ c(vi , vi +1 ) i =0 Kosten des Pfades von v nach w. dist(v, w) = inf {c(p) | p ist Pfad von v nach w} heißt Entfernung. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 18 Beispiel: 2 –1 4 1 2 3 3 4 dist(1,2) = – 1 dist(3,1) = ∞ dist(3,4) = – ∞ , da Pfad (3,4,(5,6,4)i) Kosten 3 – i hat für alle i ≥ 0. negativer Zyklus 2 6 –6 5 3 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 19 3 grundsätzliche Problemstellungen: 1 single pair shortest paths (kürzeste Wege zwischen einem Knotenpaar) 2 single source shortest paths (kürzeste Wege von einem Knoten aus) 3 all pairs shortest paths (kürzeste Wege zwischen allen Knotenpaaren) Bemerkung: Unbekannt, ob 1 leichter/effizienter lösbar als 2 . Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 20 7.3.1 Single Source Shortest Paths Sei s der „Quellknoten“. G = (V, E). Gesucht für alle u ∈ V ∞, falls kein Pfad von s nach u in G, δ (u ) := dist (s, u ), sonst. Lemma: Sei u ∈ V . Dann gilt: i) δ (u ) = −∞ gdw. u ist erreichbar aus negativem Zyklus, der von s aus erreichbar ist. ii) δ (u ) ∈ R ⇒ ∃ billigster einfacher Pfad von s nach u mit Kosten δ (u ) . Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 21 Beweis: i) "⇐" : klar! "⇒" : Sei c := ∑ c(e ) und sei p ein kürzester Weg von e∈E s nach u mit c(p) < – c. Dann muss p Zyklus q enthalten, d.h. p ist nicht einfach. Wäre nun c(q ) ≥ 0, so könnten wir q aus p entfernen und so p verkürzen/verbilligen. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 22 ii) Falls δ (u )∈ R , so gibt es Pfad von s nach u. Wir zeigen: δ (u ) = min{ c( p ) p ist Pfad von s nach u und p ist einfach }. Sei p* billigster einfacher Weg von s nach u. Ist Behauptung falsch, dann gibt es einen nichteinfachen Weg q von s nach u mit c(q) < c(p*). Durch Entfernen des Zyklus aus q entsteht kürzerer Weg q´ und da Zyklus (gemäß i) ) nicht negativ ist, folgt c(q´) ≤ c(q) < c(p*), ein Widerspruch. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 23 7.3.1.1 Der geg. Graph G = (V, E) ist azyklisch. Bsp.: 2 2 3 5 2 5 s –1 3 2 6 4 1 δ (s ) = 0, δ (2 ) = 2, δ (3) = −1, δ (4 ) = inf {7,1} = 1, δ (5) = 2 + 3 = 5, δ (6) = inf {5 + 2, 7 + 1, 1 + 1} = 2 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 24 Nachfolgender Algorithmus setzt voraus, dass Graph topologisch sortiert ist, „also“ V = {1, 2, ... , n}. Algorithmus: d(s) 0; Pfad(s) s; (* Pfad als Liste repräsentiert *) for all v ∈ V \ {s} do d(v) ∞ od; for v = s + 1 to n do d(v) min {d(u) + c(u,v) | (u,v) ∈ E} (* u* sei hierbei ein optimaler u-Wert *) Pfad(v) Pfad(u*) ° v od Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 25 Satz: Nach Ausführung von obigem Algorithmus gilt ∀v ∈ V 1) d (v ) = δ (v ) 2) d (v ) < ∞ ⇒ Pfad(v) ist billigster Weg von s nach v. 3) Algorithmus hat Laufzeit O( n + m), wobei n = |V| und m = |E|. Beweis: Korrektheit ( 1) + 2) ): Induktion über v v < s: δ (v ) = ∞, da v von s aus nicht erreichbar. d (v ) = ∞, da nach Init. nicht mehr verändert v = s: δ (v ) = d (v ) = 0. Pfad(s) = s ist einziger Weg. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 26 v > s: Sei In (v ) := { u ∈ V (u , v ) ∈ E }. Nach Ind´vor. gilt für u ∈ In (v ) schon d (u ) = δ (u ) und Pfad(u) ist berechnet. Ist In (v ) = Ø, dann d (v ) = δ (v ) = ∞. Ist In (v ) ≠ Ø, so wähle u* mit d (u *) + c(u*, v ) minimal. Falls d(u*) = ∞ , so auch d (v ) = δ (v ) = ∞. Sonst ergibt sich billigster Weg nach v durch Konkatenation und δ (v ) = δ (u *) + c(u*, v ) = d (v ). Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 27 Laufzeit: Topologisches Sortieren kostet Zeit O( n + m ). Initialisierung: O(n) „Hauptteil“: Komplexität wird i.w. bestimmt durch ∑ In(v ) = m, v∈V also O( n + m ). Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 28 7.3.1.2 Alle Kantenkosten nichtnegativ (d.h. ∀e ∈ E , c(e) ≥ 0), Zyklen erlaubt Dijkstras Algorithmus: Nachfolgend nur Kosten kürzester Pfad berechnet; eigentliche Pfadberechnung analog vorher. Idee: Für Menge S von Knoten mit bereits bestimmtem kürzesten Pfad muss es Knoten x ∈ V \ S geben, sodass kürzester Weg von s nach x über die Knoten in S geht und dann noch eine Kante aus S nach x. Genauer: x ist Knoten, der für alle u ∈ S den Ausdruck δ (u ) + c (u , x ) minimiert. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 29 Nachfolgend: S := Menge der Knoten u mit bekanntem δ(u ). S ′ := Menge der Knoten aus V \ S , die Nachbarn in S haben Algorithmus: S ← {s}; d (s ) ← 0; S ′ ← OutAdj(s ); for all u ∈ S ′ do; d ′(u ) ← c(s, u ); for all u ∈ V − (S ∪ S ′) do d ′(u ) ← ∞; Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 30 while S ′ ≠ o/ do x ← derjenige Knoten aus S ′ mit minimalem d ′ - Wert; d ( x ) ← d ′( x ); S ← S ∪ {x}; S ′ ← S ′ \ {x}; for all u ∈ OutAdj ( x ) do if u ∉ S then S ′ ← S ′ ∪ {u }; d ′(u ) ← min {d ′(u ), d ( x ) + c ( x , u )} fi od od Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 31 Beispiel (Dijkstra, Ungerichteter Graph): S = {s, D, C}, S´={E, B, A} d(C) = 2, d´(B) = 5, d´(E) = 3, d´(A) = 3 S = {s}, S´={C, D, E} 3 1 A B 4 d(s) = 0, d´(C) = 2, 1 4 d´(D) = 1, 3 D 1 2 C d´(E) = 5 1 2 2 S = {s, D, C, A}, S = {s, D}, S´={E, B} 0 s 3 E 5 S´={C, E, B} d(A) = 3 d(D) = 1, d´(B) = 4, S = {s, D, C, A, E}, d´(C) = 2, d´(E) = 3 S´={B} d´(E) = 3, d(E) = 3 S = {s, D, C, A, E, B}, d´(B) = 5 d´(B) = 4, d(B) = 4, Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 32 Beispiel (Dijkstra, Gerichteter Graph): 1 1 10 1 5 4 4 4 B 6 0 s 1 H 1 F 3 7 7 2 2 2 C 5 2 3 3 3 6 3 G 5 5 2 A J 1 E 1 1 2 3 2 I 1 10 7 D 4 K 8 8 5 5 9 10 2 L ∞ 10 9 9 12 11 11 9 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 33 Lemma: Sei x ∈ S ′ so gewählt, dass d ′( x ) minimal ist. Dann gilt d′(x) = δ (x). Beweis: Sei p ein billigster Weg von s nach x derart, dass alle Knoten (bis auf x) in S liegen. Angenommen, es gäbe einen billigeren Weg q von s nach x. q muss einen ersten Knoten v in V \ S haben und nach Wahl von x ist d ′(v ) ≥ d ′( x ). Da alle Kanten nichtnegativ sind, gilt aber c(q ) ≥ d ′(v ) ≥ d ′( x ) = d ( x ) = c( p ), ein Widerspruch. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 34 Zur Laufzeit: Implementiere S und S ′ als Bitvektoren und d und d ′ als Arrays. •Aufwand für „ for all u ∈ OutAdj( x ) “: ∑ OutAdj( x ) = O(m + n ). x∈V •n-maliges Minimieren über S ′ : O(n ² ). Insgesamt ergibt sich Laufzeit O(n²+m), für dichte Graphen (m ≈ n ² ) ausreichend. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 35 Alternativ: Speichere S ′ in Heap (balancierter Baum), gemäß d ′-Werten geordnet. Damit Laufzeit O((m+n)log n),da nun Einfügen und Löschen in S ′ je O(log n ) Zeit kostet. Für dünne Graphen ist dies eine Verbesserung. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 36 Satz: Mit Hilfe des Algorithmus von Dijkstra läßt sich das Single Source Shortest Path Problem in Laufzeiten O(n ² ) bzw. O((m + n ) log n ) lösen. Mitteilung: Mit Hilfe sogenannter Fibonacci-Heaps läßt sich die Laufzeit des Algorithmus von Dijkstra asymptotisch zu O(n log n + m) verbessern. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 37 7.3.1.3 Negative Kantenkosten erlaubt, aber keine negativen Zyklen. Bellman-Ford-Algorithmus Das „Entspannen einer Kante (v,w)“ bezeichnen wir mit Relax ((v,w)): d (w) ← min{d (w), d (v ) + c(v, w)} Offensichtlich: Entspannen einer Kante erhöht keinen d-Wert Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 38 Lemma: Falls für alle u ∈ V vor dem Entspannen einer beliebigen Kante (v,w) gilt, dass d(u) ≥δ (u) , dann gilt dies auch hinterher. Beweis: Jeder Weg von s nach v zusammen mit Kante (v,w) ergibt Weg von s nach w. Deshalb δ (v ) + c (v, w ) ≥ δ (w ). Weiterhin: δ (v) + c(v,w) ≤ d (v) + c(v,w) ⇒ δ (w) ≤ d (v) + c(v, w) ⇒ δ (w) ≤ d (w) falls (v,w) „echt“ relaxiert. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 39 Algorithmus: d (s ) ← 0; for all v ≠ s do d (v ) ← ∞ while „ möglich“ do Entspanne Kanten od Beobachtung: d(u) wird immer kleiner, unterschreitet aber nie δ(u) . Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 40 Offen bleibt noch die Frage nach der „Entspannungs-Reihenfolge“, sodass d schnell gegen δ konvergiert. Lemma: Sei w∈ V und sei δ (w) < ∞ und sei (v, w) die letzte Kante auf dem billigsten Weg von s nach w. Dann gilt: Falls (v,w) entspannt wird, nachdem d(v) = δ(v) geworden ist, so ist danach d(w) = δ(w). Beweis: Übung! Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 41 Algorithmus: d (s ) ← 0; for all v ≠ s do d (v ) ← ∞; for i ← 1 to n − 1 do for all (v, w) ∈ E do Relax ((v, w)); Bem.: im Beispiel spielt die Reihenfolge der Kanten in der for all-Schleife eine Rolle, die Aussagen gelten aber für alle Reihenfolgen Lemma: Für i=0,..., n-1 gilt: Nach dem i-ten Durchlauf der for-Schleife ist d (w) = δ(w) für alle w ∈ V , für die es einen billigsten Pfad der Länge i von s nach w gibt. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 42 Beweis: Induktion über i: i = 0 : d (s ) = δ(s ), da es keine negativen Zykel gibt. i → i +1: Sei w der Knoten mit billigstem Weg von s nach w der Länge i+1 und sei (v,w) die letzte Kante auf diesem Weg. Also gibt es billigsten Weg von s nach v der Länge i und nach Induktionsannahme ist nach dem i-ten Durchlauf der for-Schleife d (v ) = δ(v ) . Im (i+1)-ten Durchlauf wird insbesondere (v,w) entspannt: ⇒ d (w) = d (v ) + c((v, w)) = δ(v ) + c((v, w)) = δ( w ) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 43 Korollar: Nach dem (n-1)-ten Schleifendurchlauf gilt für alle v aus V, dass d (v ) = δ(v ). Beweis: Nach obigem Lemma und der Annahme der Nichtexistenz negativer Zyklen folgt, dass alle billigsten Wege Länge höchstens n-1 haben. Insgesamt: Satz: In Laufzeit O(n ⋅ m ) läßt sich das Single Source Shortest Path Problem lösen, falls der Graph keine negativen Zyklen enthält. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 44 Beispiel (Bellmann-Ford, Gerichteter Graph, positive Kanten): 1 B 10 5 4 6 0 s 1 H 1 F 3 7 2 2 C 5 2 L ∞ 2 3 3 3 6 3 G 5 5 2 A J 1 E 1 1 10 9 2 3 I 1 10 7 D 4 K 12 11 8 5 9 1 4 i = 1, i = 2, i = 3, i = 4, i = 5, Vorlesung Algorithmen (RN/MK/AZ) i = 6, i = 7, i = 8, WSI für Informatik, Universität Tübingen 45 Beispiel (Bellmann-Ford, Gerichteter Graph, negative Kanten, aber keine negativen Zyklen): 1 7 1 5 1 4 B 6 0 s 1 H 1 F 3 4 2 -1 C -5 2 L ∞ 2 -3 -3 3 6 3 G 5 -5 2 A J 1 E -1 1 1 2 3 I 1 7 7 D 4 K 3 5 5 4 4 i = 1, i = 2, i = 3, i = 4, i = 5, Vorlesung Algorithmen (RN/MK/AZ) i = 6, i = 7, i = 8, WSI für Informatik, Universität Tübingen 46 Beispiel (Bellmann-Ford, Ungerichteter Graph, positive Kanten): 0 1 1 A 2 s 4 B 4 3 6 5 6 2 5 C 1 D 6 12 11 10 E 4 9 7 6 i = 1, i = 2, i = 3, i = 4, i = 5, Warum braucht der Algorithmus hier n-1 Iterationen bis zur Konvergenz? Welches wäre der einfachste Graph mit dieser Eigenschaft? Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 47 7.3.1.4: Auch negative Zyklen erlaubt. Algorithmus: 1 Führe zuerst die n-1 for-Schleifendurchläufe des Algorithmus von Bellman-Ford aus und merke in d1 die so erzielten d-Werte. 2 Führe n weitere for-Schleifendurchläufe aus und speichere das Ergebnis in d2. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 48 Lemma: Für w ∈ V gilt : i) d 2 (w) = d1 (w) ⇒ δ(w ) = d1 (w) ii) d 2 (w) < d1 (w) ⇒ δ(w ) = −∞ Beweis: Übung! Bemerkung: Wenn sich nach nur einem weiteren Durchlauf der for-Schleife nach Abschluss von 1 noch etwas ändert, so gibt es einen negativen Zyklus, sonst aber nicht. Um aber alle Zyklen entdecken zu können, benötigt man in 2 insgesamt n Durchläufe. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 49 7.3.2 All Pairs Shortest Paths (Floyd-Warshall) Annahme: Keine negativen Zyklen. V = {1,2,..., n} Für i, j ∈ V und 0 ≤ k ≤ n definiere δ k (i, j ) := Kosten des billigsten Weges von i nach j , dessen innere Knoten ≤ k sind. Beispiel: δ 0 (1,4 ) = ∞ δ1 (1,4 ) = ∞ δ 2 (1,4 ) = 6 δ 3 (1,4 ) = 1 4 2 2 2 1 -3 3 4 5 δ 4 (1,4 ) = 1 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 50 Also: c(i, j ), falls (i, j ) ∈ E. δ 0 (i, j ) = 0 , falls i = j. ∞ , sonst. δ n (i, j ) = δ(i, j ) = Kosten des billigsten Weges von i nach j. Frage: Wie berechnet sich δ k aus δ k-1 ? Entweder k Teil eines billigeren Weges oder nicht: 2 Möglichkeiten: δ k-1 (i, j ) i δ k-1 (i, k ) k j δ k-1 (k , j ) Also gilt: δ k (i, j ) = min{δ k −1 (i, j ), δ k −1 (i, k ) + δ k −1 (k , j )} Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 51 Algorithmus (Floyd-Warshall): for all i , j ∈ V do c (i , j ), falls (i , j ) ∈ E δ 0 (i , j ) ← 0 , falls i = j ∞ , sonst ; od for k = 1 to n do for i = 1 to n do for j = 1 to n do δ k (i , j ) ← min { δ k −1 (i , j ), δ k −1 (i , k ) + δ k −1 (k , j )} od od od Laufzeit: O(n³) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 52 Beispiel (Floyd-Warshall, Ungerichteter Graph, positive Kanten): 1 2 2 1 4 3 D1 = D0 0137uu 1026uu D2 = 3 2 0 2 5 u 762016 uu5104 uuu640 6 4 1 2 5 5 6 6 4 01358u 10247u D3 = 3 2 0 2 5 u 542016 875104 uuu640 Vorlesung Algorithmen (RN/MK/AZ) D0 = 014uuu 1026uu 42025u u62016 uu5104 uuu640 0 1 3 5 6 11 1 0 2 4 5 10 D4= 3 2 0 2 3 8 u.s.w. 542016 653104 1110 8 6 4 0 WSI für Informatik, Universität Tübingen 53 Alternativer Algorithmus: Benutze Algorithmus von Dijkstra bzw. Bellman-Ford Idee: Führe n-mal für alle möglichen Startknoten Bellman-FordAlgorithmus aus. Laufzeit : O(n ⋅ nm ) Beobachtung: Es reicht sogar, einmal Bellman-Ford und (n-1)-mal Dijkstra auszuführen. Laufzeit : O(n ⋅ (n + m ) log n ) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 54 7.3.3 All Pairs Shortest Paths (Matrixmultiplikation) Annahme: Keine negativen Zyklen. G = (V , E ), V = {1,2,..., n} Wir wissen (Lemma): Wenn ein Pfad von i über k nach j der kürzeste Pfad von i nach j ist, dann sind auch die Pfade von i nach k und von k nach j jeweils kürzeste Pfade. Sei G als Adjazenzmatrix W = (wij) repräsentiert. Sei p ein kürzester Pfad von i nach j mit m Kanten. Es gilt: m < n. Falls i = j, dann hat p die Länge 0 und keine Kanten. Falls i ≠ j, dann zerlegen wir p in Pfad p´ von i nach k und Kante (k, j), wobei p´ dann m-1 Kanten hat. Es gilt: δ (i, j ) = δ (i, k ) + wkj Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 55 Sei lij(m ) der kürzeste Pfad zwischen Knoten i und j, der höchstens m Kanten hat. Für m = 0 gilt 0 falls i = j (0) lij = sonst ∞ Für m ≥ 1 berechnen wir ( { +w } lij( m ) = min lij( m −1) , min1≤ k ≤ n lik( m −1) + wkj { = min1≤ k ≤ n lik( m −1) kj }) denn wjj = 0 für alle j Da ein kürzester Weg von i nach j höchstens n-1 Kanten hat, gilt δ (i, j ) = lij( n −1) = lij( n ) = lij( n +1) = ... Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 56 Wir berechnen also die lij(m )in einer Folge von Matrizen L(1), L(2), ... L(n-1), mit L(m) = ( lij(m )). Algorithmus Slow-All-Pairs-Shortest-Paths (W) (1) := W 1) L(old) := W 4) Zeitaufwand: O(n 2) for m := 2 to n-1 do begin 3) for i := 1 to n do 4) for j := 1 to n do begin Verwendung von (m (new ) ) 5) lij :=:=∞∞ nur zwei Matrizen L(new) und L(old) 6) for k := 1 to n do m) ) ) ) ( m −( 1old 7) llij(ij(new :=min( min(llij(ijm( new := , lik, lik ) +) +ww kj ) kj ) 8) end 9) L(old) := L(new) 10) end Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 57 Beispiel: 4 2 2 1 -3 0 4 − 3 ∞ ∞ 0 ∞ 2 L(1) = ∞ 2 0 5 ∞ ∞ ∞ 0 0 − 1 − 3 1 ∞ 0 ∞ 2 L(3) = ∞ 2 0 4 ∞ ∞ ∞ 0 Vorlesung Algorithmen (RN/MK/AZ) 2 L( 2 ) 3 4 5 0 −1 − 3 ∞ 0 ∞ = ∞ 2 0 ∞ ∞ ∞ WSI für Informatik, Universität Tübingen 2 2 4 0 58 Beispiel (Matrixmultiplikationsalgorithmus): 2 1 2 1 4 0 1 3 1 0 2 L2 = 3 2 0 6 4 2 9 7 3 u 12 8 3 6 4 2 0 1 5 9 u 7 12 3 8 1 5 0 4 4 0 6 2 5 4 1 5 6 6 4 0 1 3 1 0 2 L3 = 3 2 0 5 4 2 7 5 3 1210 7 Vorlesung Algorithmen (RN/MK/AZ) 0 1 L1=W= 4 u u u 5 4 2 0 1 5 7 12 5 10 3 7 1 5 0 4 4 0 1 0 2 6 u u 4 2 0 2 5 u u 6 2 0 1 6 u u 5 1 0 4 0 1 1 0 L4 = 3 2 5 4 6 5 11 9 5 L : 10 3 2 0 2 3 7 5 4 2 0 1 5 6 11 10 5 9 3 7 1 5 0 4 4 0 WSI für Informatik, Universität Tübingen u u u 6 4 0 59 Geht es auch schneller? Ja, durch Quadrierung! Bisher hatten wir berechnet: =W L(1) = L(0) * W L(2) = L(1) * W = W2 L(3) = L(2) * W = W3 ... L(n-1) = L(n-2) * W = Wn-1 Jetzt berechnen wir schneller: =W L(1) = L(2) = W * W = W2 L(4) = W2 * W2 = W4 L(8) = W4 * W4 = W8 ... Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 60 Algorithmus Fast-All-Pairs-Shortest-Paths (W) 1) L(old) := W 2) m := 1 3 log n), Zeitaufwand: O(n 3) while m < n-1 do das ist aber immer noch 4) for i := 1 to n do langsamer als der 5) for j := 1 to n do begin Floyd-Warshall-Algorithm. (new ) 6) lij := ∞ 7) for k := 1 to n do 8) lij( new) := min(lij( new) , lik( old ) + lkj( old ) ) 9) end 10) m := 2m 11) L(old) := L(new) 12) endwhile Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 61 7.4 Depth First Search (Tiefensuche) Durchmusterung von Graphen. Wichtige Eigenschaften: Mit DFS Graph systematisch von einem Knoten s aus zu durchmustern, dabei immer zuerst „in die Tiefe“. Beispiel: s Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 62 Rekursion: procedure DFS (s) besucht [s] true; drucke (s); for all (s, v ) ∈ E do if not besucht [v] then DFS(v) fi; od Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 63 DFS teilt die Kanten des Graphen in vier Klassen ein, je nach Art des Besuchs: Wir betrachten gerade die gerichtete Kante (v,w): 1. (v,w) gehört zu Baumkanten T, falls w noch nicht besucht. 2. (v,w) gehört zu Vorwärtskanten F, falls w schon besucht *T w “, d.h. ∃ Pfad von v nach w bestehend aus und „ v → lauter Baumkanten. 3. (v,w) gehört zu Rückwärtskanten B, falls w schon besucht *T v. → und w 4. (v,w) gehört zu Querkanten C, falls w schon besucht, aber *T v. *T w noch w → weder v → Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 64 Erweiterung um dfsnum(v) und compnum(v): • dfsnum(v): Reihenfolge der rekursiven DFS-Aufrufe. • compnum(v): Abschlussreihenfolge der DFS-Aufrufe. Hauptprogramm: for all v ∈ V do besucht[v] false od; z1 z2 0; T ← B ← F ← C ← o/ ; for all v ∈ V do if not besucht[v] then DFS(v) fi od Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 65 Für die Implementierung brauchen wir 2 Zähler z1, z2: (1) procedure DFS(v) (2) besucht[v] true; z1 z1+1 (3) dfsnum[v] z1; (4) for all (v, w) ∈ E do (5) if not besucht[w] then T ← T ∪ {(v, w)} (6) DFS(w) *T w then F ← F ∪ {(v, w)} (7) else if v → *T v then B ← B ∪ {(v, w)} → (8) else if w (9) else C ← C ∪ {(v, w)} (10) fi (11) fi (12) fi (13) od (14) z 2 ← z 2 + 1; (15) compnum[v] z2 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 66 Beispiel: i 9 9 b 2 1 dfsnum[v] s d 4 2 f 6 3 a 1 8 c 3 6 e 5 5 compnum[v] g 7 4 h 8 7 Laufzeit: da O(n+m) a) Einzellaufzeit eines Aufrufs (ohne Rekursion) ist O(1+outdeg(v)) b) für jeden Knoten einmal DFS-Aufruf ⇒ O ∑ (1 + out deg(v )) = O(n + m ). v∈V Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 67 Beispiel (Klassifikation der Kanten durch DFS): 12 11 B 1 12 s 3 9 C A 2 10 10 8 F 11 7 H 6 3 G J E D 4 6 Vorlesung Algorithmen (RN/MK/AZ) 5 5 L 13 13 I 9 4 7 2 K 8 1 WSI für Informatik, Universität Tübingen 68 Beispiel (Klassifikation der Kanten durch DFS): 12 11 B 1 12 s 3 9 C A 2 10 10 8 F 11 7 H 6 3 G J E D 4 6 Vorlesung Algorithmen (RN/MK/AZ) 5 5 L 13 13 I 9 4 7 2 K 8 1 WSI für Informatik, Universität Tübingen 69 Lemma (Eigenschaften, Teil 1): a) Kantenklassen T,B,F,C bilden Partition der Kantenmenge E b) T entspricht dem Wald der rekursiven Aufrufe *T w gdw. dfsnum[v ] ≤ dfsnum[w] und c) v → compnum[w] ≤ compnum[v ]. * z) , *T w, (w, z ) ∈ E und ¬ (v d) Seien v, w, z ∈ V mit v → → T dann v * w i) dfsnum[z ] < dfsnum[v ] ii) (w, z ) ∈ B ∪ C ? z iii) compnum[z ] > compnum[v ] gdw. (w, z ) ∈ B. iv) compnum[z ] < compnum[v ] gdw. (w,z ) ∈ C. z * v Vorlesung Algorithmen (RN/MK/AZ) * w * v z WSI für Informatik, Universität Tübingen * w 70 Beweis: a), b) klar: direkt aus Algorithmus. *T w ⇔ Aufruf DFS(w) geschachtelt in DFS(v) → c) v ⇔ dfsnum[v ] ≤ dfsnum[w] und compnum[v ] ≥ compnum[w]. d) *T w ⇒ dfsnum[v ] ≤ dfsnum[w] v → (w, z ) ∈ E ⇒ DFS( z ) wird aufgerufen, bevor DFS(w) endet, und auch bevor DFS(v) endet. *T z ) ⇔ DFS( z ) nicht in DFS(v) geschachtelt ¬(v → ⇒ DFS( z ) startet vor Aufruf DFS(v ). ⇒ dfsnum[z ] < dfsnum[v ] (i) e) ( Teil 2 ) → (w, z ) ∈ B ∪ C (ii) *T w nach Definition von B (w, z ) ∈ B ⇔ z → * v da v *T w und ¬(v *T z ) → → ⇔z → T ⇔ compnum[z ] > compnum[v ] (iii) (ii), (iii) (iv) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 71 Lemma (Eigenschaften, Teil 2): Sei (v, w) ∈ E : e) (v, w) ∈ T ∪ F ⇔ dfsnum[v ] ≤ dfsnum[w]. f) (v, w) ∈ B ⇔ dfsnum[w] < dfsnum[v ] und compnum[w] > compnum[v ]. g) (v, w) ∈ C ⇔ dfsnum[w] < dfsnum[v ] und compnum[w] < compnum[v ]. e) f) v w * v * w Vorlesung Algorithmen (RN/MK/AZ) * w g) * * v * w w vor v besucht WSI für Informatik, Universität Tübingen v 72 Beweis: e) *T w ⇒ dfsnum[v ] ≤ dfsnum[w] (v, w) ∈ T ∪ F ⇒ v → Sei dfsnum [v ] ≤ dfsnum [w]. Da (v, w ) ∈ E , muss DFS(w ) vor Abschluss von DFS(v ) aufgerufen werden. ⇒ echte Schachtelu ng *T w v → ⇒ (v, w ) ∈ T ∪ F f), g) folgen aus d) und e) ... Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 73 Bemerkungen: •T, B, F, C werden im wesentlichen durch dfsnum, compnum festgelegt (vgl. Lemma!) •In azyklischen Graphen gibt es keine Rückwärtskanten, d.h. ∀(v, w) ∈ E : compnum[v ] > compnum[w] ⇒ Nummerierung num(v ) := n + 1 − compnum[v ] ergibt topologische Sortierung. Mitteilung: Zusammenhangskomponenten in ungerichteten Graphen können mit Hilfe von DFS in Zeit O(n+m) berechnet werden. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 74 Starke Zusammenhangskomponenten Ein gerichteter Graph G=(V,E) heißt stark zusammen* w. → hängend gdw. ∀v, w ∈ V : v E Die maximalen (bzgl. Mengeninklusion) stark zusammenhängenden Teilgraphen von G heißen starke Zusammenhangskomponenten (SZK‘s). Beispiel: a c b K1 K3 d h K4 e K2 Vorlesung Algorithmen (RN/MK/AZ) f g WSI für Informatik, Universität Tübingen 75 Idee für Algorithmus: Erweitere DFS: Sei G′ = (V ′, E ′) bisher erforschter Teilgraph von G. Verwalte die SZK' s von G : Starte mit V ′ = {a}, E ′ = o/ , SZK = {{a}}. Sei (v,w) die nächste Kante in DFS. Dann ist v ∈ V ′. Ist w ∉ V ′, d.h. (v, w) ∈ T , dann erweitere SZK um {w}. Ist w ∈ V ′, dann füge mehrere SZK' s zu einer zusammen (falls (v, w) ∈ B ∪ C ) Aber wie zusammenfügen? w ∈V ′ V´ w ∉V ′ V´ * v w Vorlesung Algorithmen (RN/MK/AZ) w * * v * w WSI für Informatik, Universität Tübingen v 76 Bezeichnungen: • SZK K heißt abgeschlossen, wenn alle DFS-Aufrufe für Knoten in K abgeschlossen sind. • Wurzel von K ist der Knoten mit kleinster dfsnum in K. • Folge von Knoten heißt unfertig, falls ihre DFS aufgerufen sind, aber ihre SZK noch nicht abgeschlossen ist. (Sortiert nach dfsnum!) • wurzeln ist Folge der Wurzeln von noch nicht abgeschlossenen SZK´s. (Sortiert nach dfsnum!) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 77 Beispiel: a c b d h e f unfertig: wurzeln: a a bc b e e g f f g g Beobachtung: * g 1. ∀v ∈ unfertig : v → E 2. ∃/(v, w) ∈ E : v in abgeschlossener und w in nicht abgeschlossener Komponente. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 78 Von g ausgehende Kanten: ( g , d ) ∈ C : tut nichts, d liegt in abgeschlossener SZK. ( g , b ) ∈ B : vereinigt vier Komponenten {b, c}, {e}, { f }, {g}. unfertig: wurzeln: a a bcefg b ( g , h ) ∈ T : erzeuge neue Komponente {h} Beim Abschluss von DFS(v) teste, ob v Wurzel. Wenn ja, so gib Komponente mit v als Wurzel aus und streiche sie aus unfertig und v aus wurzeln. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 79 Operationen auf unfertig und wurzeln erlauben Implementierung als Keller (Stack): z.B. Vereinigen von Komponenten: unfertig K1 K2 w K3 K4 v wurzeln wurzeln K2, K3 und K4 werden vereinigt durch pop(wurzeln) bis top(wurzeln) = Wurzel der SZK von w. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 80 Beispiel (Bestimmung der SZKs durch DFS): B s C A L G J E D unfertig H F I K s A C D E G J K I F H B L wurzeln s A C D E G J K I F H B L print K J G H Vorlesung Algorithmen (RN/MK/AZ) F I E D C A B s WSI für Informatik, Universität Tübingen L 81 Korrektheit: Invarianten: I1: I2: I3: Zu zeigen: ∃/(v, w) ∈ E mit v in abgeschlossener und w in nichtabgeschlossener SZK. Nichtabgeschlossene SZK´s liegen auf einem Pfad, insbesondere ihre Wurzeln liegen auf einem Baumpfad Knoten jeder nicht abgeschlossenen Komponente Ki bilden Intervall in „unfertig“, erstes Element des Intervalls ist die Wurzel von Ki. Invarianten bleiben beim Einfügen neuer Kanten (v, w) ∈ E erfüllt. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 82 1.Fall: (v, w) ∈ T : push (w, unfertig); push (w, wurzeln) I1: Es wird keine SZK abgeschlossen. I2: Sei r Wurzel der Komponente von v. *T v und (v, w) ∈ T → Dann r *T w ⇒ r → I3: Trivial! Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 83 2.Fall: (v, w) ∈/ T : a) w in abgeschlossener SZK: Tue nichts. b) w in nicht abgeschlossener SZK: Vereinige oberste SZK´s bis zu der, in der w liegt. In a) passiert nichts. Nur b) zu betrachten: I1: Es wird keine SZK abgeschlossen... I2: Pfad wird verkürzt. I3: Löschen der obersten Wurzel vereinigt Intervalle zu einem neuen. Da vorher I2 galt, bildet dieses eine Intervall eine einzige Komponente. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 84 Durch nachfolgenden Algorithmus (Programm) erhalten wir: Satz: Starke Zusammenhangskomponenten eines gerichteten Graphen können in Zeit O(n+m) berechnet werden. Das Hauptprogramm wird erweitert um: unfertig wurzeln leerer Keller Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 85 (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) procedure DFS(v) besucht[v] := true; z1:= z1+1; dfsnum[v] := z1; push(v, unfertig); push(v, wurzeln); for all(v, w) ∈ E do if not besucht[w] then DFS(w) else if w ∈ unfertig then while dfsnum[top(wurzeln )] > dfsnum[w] do pop(wurzeln) od ; fi fi od z2 := z2+1; compnum[v] := z2 if v = top(wurzeln) then repeat w := pop(unfertig) print(w) until v = w ; pop(wurzeln) ; fi Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 86 Zeilen (13)-(16) : Ausgabe der SZK mit Wurzel v. Bemerkungen: • Test „w ∈ unfertig“ wird mit zusätzlichem booleschen Feld in_unfertig unterstützt. • Jeder Knoten wird höchstens einmal nach unfertig bzw. wurzeln aufgenommen. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 87 7.5 Minimal aufspannende Bäume (MST) Sei G(V,E) ein zusammenhängender, ungerichteter Graph. Sei c:E → R+ eine Kostenfunktion. Ziel: Berechne ET ⊆ E, sodass G(V,ET) zusammenhängend ist und c( ET ) := ∑ c(e ) kleinstmöglich ist. e∈ET Beispiel: 10 3 1 4 2 3 2 6 2 8 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 88 Anwendungsbeispiele: • Computer-Netzwerke... • Elektronische Schaltkreise... • Netz von Telefonanschlüssen... uvm. Lemma: G(V,ET) ist azyklisch. Beweis: Würde G(V,ET) einen Kreis enthalten, so könnte man eine Kante entfernen, der Graph wäre weiterhin zusammenhängend und die Gesamtkosten geringer. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 89 Wir suchen also einen „aufspannenden Baum“ mit minimalen Kosten (MST, Minimum Spanning Tree). Kruskals Greedy-Algorithmus für MST Sortiere Kanten e1, e2, ... , em so, dass c(e1 ) ≤ c(e2 ) ≤ ... ≤ c(em ); ET ← o/ ; for i ← 1 to m do if (V , ET ∪ {ei }) azyklisch then ET ← ET ∪ {ei } fi od Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 90 Satz: Der Greedy-Algorithmus von Kruskal ist korrekt, d.h. er findet immer einen MST. Beweis: Eine Kantenmenge E ′ ⊆ E heiße „gut“, falls sie zu einem MST erweiterbar ist. Behauptung: Sei E ′ ⊆ E gut und sei e ∈ E \ E ′ eine billigste Kante, sodass der Graph (V , E ′ ∪ {e}) azyklisch ist. Dann ist auch E ′ ∪ {e} gut. Beweis der Behauptung per Induktion: Sei T1 = (V , E1 ) ein MST mit E ′ ⊆ E1 (T1 existiert, da E ′ gut ). Ist e ∈ E1 , so fertig. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 91 Ist e ∉ E1, so betrachte Graph H = (V , E1 ∪ {e}). H enthält einen Kreis, auf dem e liegt. Da (V , E ′ ∪ {e}) azyklisch ist, enthält dieser Kreis auch eine Kante aus E1 \ ( E ′ ∪ {e}). Sei eine solche Kante e1. Betrachte T2 = (V , ( E1 \ {e1}) ∪ {e}). T2 ist aufspannend und c(T2 ) = c(T1 ) + c(e ) − c(e1 ). Da e eine billigste Kante war, gilt c(e ) ≤ c(e1 ). Also c(T2 ) ≤ c(T1 ). Da nach Voraussetzung T1 ein MST ist, gilt c(T2 ) = c(T1 ). D.h. T2 auch ein MST, also E ′ ∪ {e} gut. Mit der Behauptung folgt die Korrektheit von Kruskals Algorithmus unmittelbar. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 92 Beispielbild: T1 : E1 e1 e T2 : ( E1 \ {e1}) ∪ {e} Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 93 Zur Implementierung: Wir halten uns eine Partition V1 ∪ V2 ∪ ... ∪ Vk = V von V : ∀i ≠ j : Vi ∩ V j = o/ und ∀i : Vi ≠ o/ . Operationen: Starten mit Partition {{1}, {2}, ... , {n}}. Benötigen: •Find(x): •Union(a,b): Vorlesung Algorithmen (RN/MK/AZ) Gibt Namen der Menge zurück, die x enthält. Vereinigt die Mengen a und b. WSI für Informatik, Universität Tübingen 94 Damit wird die for-Schleife in Kruskals Algorithmus zu: for i ← 1 to m do sei ei = {u , v}; a ← Find(u ); b ← Find(v ); if a ≠ b then ET ← ET ∪ {ei }; Union(a,b) fi od Bemerkung: Auf diese Weise lassen sich i.w. auch die Zusammenhangskomponenten eines Graphen berechnen. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 95 Zur Realisierung der Union-Find-Datenstruktur: Erste naheliegende Idee: Realisierung als Feld R[1 .. n], wobei R[x] Name der Menge sein soll, die x enthält. Damit: Find(x): return R[x] Union(a,b): for i ← 1 to n do if R[i ] = a then R[i ] ← b fi od Laufzeit: Find(x): Union(a,b): O(1) O(n) Algorithmus von Kruskal: 2m Find-Operationen und n-1 Union-Operationen. Laufzeit Kruskal: O(m+n²+m log m) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 96 Heuristische Ideen zur Verbesserung: •Union sollte nicht alle Elemente anschauen... Verwalte Elemente jeder Menge separat... •Behalte bei Union immer die Namen der größeren Mengen. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 97 Also zusätzlich Verwaltung der Mengen als Listen (samt Größenangabe): Bild: Size Elem. 1 2 2 3 5 4 1 R: Vorlesung Algorithmen (RN/MK/AZ) wie vorher WSI für Informatik, Universität Tübingen 98 Damit folgende Implementierung: Initialis: Find(x): Union(a,b): for x ← 1 to n do R[x ] ← x; Elem[x ] ← {x}; size[x ] ← 1; od return R[x] if size[a] < size[b] then „vertausche a und b“ fi; for all x ∈ Elem[b] do R[ x ] ← a ; insert(x, Elem[a]) od; size[a ] ← size[a ] + size[b] Beachte: Im Worst Case kann ein Union aber dennoch Zeit O(n) benötigen. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 99 Satz: Mit obiger Implementierung lassen sich die Initialisierungen sowie n-1 Union-Operationen und m Find-Operationen in Laufzeit O(n ⋅ log n + m ) realisieren. Beweis: Initialisierungen: O(n), klar! m Find-Operationen: O(m), klar! n Union-Operationen kosten Zeit O(n log n): Union(a,b): Vereinige zwei Mengen mit na bzw. nb Elementen; o.E. sei nb ≤ na ⇒ Laufzeit O(1 + nb ). Sei ni für i-tes Union die Größe der kleineren Menge. Damit n −1 Zeit für alle Union-Operationen: n −1 O ∑ (ni + 1) = O n + ∑ ni . i =1 i =1 Immer wenn ein Element die Menge wechselt, trägt es n −1 genau 1 zu ∑ ni bei. i =1 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 100 n −1 n i =1 j =1 Also ∑ ni = ∑ rj , wobei rj angibt, wie oft Element j die Menge wechselt. Behauptung: rj ≤ log 2 n für alle j = 1, 2, ... , n. Beweis der Behauptung: Wenn j die Menge wechselt und vorher in einer Menge mit l Elementen war, so ist j nachher in einer Menge mit mindestens 2l Elementen. D.h. nach dem k-ten Wechsel ist j in einer Menge mit ≥ 2 k Elementen. Da es nur n Elemente gibt, folgt k ≤ log 2 n. Mit Hilfe der Behauptung folgt somit, dass n Union-Operationen Zeit O(n log n) kosten. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 101 Korollar: Der Algorithmus von Kruskal hat Laufzeit O(m ⋅ log m ) . Bemerkung: Obiges ist ein Beispiel für amortisierte Analyse: Wir betrachten statt Einzeloperationen, welche verschieden teuer sind, eine Folge von Operationen und stellen fest, wieviel diese zusammen kosten. Anderes Beispiel für amortisierte Analyse: Binärzähler: Nicht trivial n log n, sondern 2n amortisiert... Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 102 Beispiel (Kruskal, Ungerichteter Graph, nichtnegative Kanten): 1 B s 2 3 4 1 2 C 5 A 3 6 F 3 6 3 3 E D Vorlesung Algorithmen (RN/MK/AZ) 7 H 1 G 5 2 L 3 J 1 1 2 I 4 K WSI für Informatik, Universität Tübingen 103 Alternative zur vorigen Implementierung: Idee: Repräsentiere jede Menge durch einen Baum (i.a. nicht binär): Jeder Knoten (außer Wurzel) zeigt auf Elternknoten, Wurzel enthält Namen der Menge. R[x] x Damit: Union(a,b): „Zusammenhängen“ von Bäumen. a b Zeit: O(1) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 104 Find(x): Folge dem Pfad von x zur Wurzel. Zeit: O(1+Tiefe(x)). Ideal wäre also Baumtiefe 1... Im Worst Case können n Union-Op. aber zu Tiefe n-1 führen. Deshalb: „Gewichtete Vereinigungsregel“: Hänge immer den kleineren an den größeren Baum (Baumgröße = Anzahl der Knoten). Weitere Idee: Pfadkomprimierung Wenn bei Find der Pfad zur Wurzel zurückverfolgt wird, so hänge alle Zeiger des Pfades zur Wurzel hin um: Bild: x Vorlesung Algorithmen (RN/MK/AZ) x WSI für Informatik, Universität Tübingen 105 Mitteilung: Mit gewichteter Verzweigungsregel und Pfadkomprimierung lassen sich die Initialisierungen sowie n-1 Union-Operationen und m Find-Operationen in Laufzeit O(n + m ⋅α (m + n,n)) realisieren, wobei α die Inverse der Ackermannfunktion ist. α wächst extrem langsam und ist für alle realistischen Werte ≤ 5. Der Beweis obiger Mitteilung ist ziemlich kompliziert. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 106