Informatik II - SS 2016 (Algorithmen & Datenstrukturen) Vorlesung 15 (15.6.2016) Graphenalgorithmen III (MST) Fabian Kuhn Algorithmen und Komplexität Fabian Kuhn Informatik II, SS 2016 DFS- “Klammer”-Theorem Wir definieren für jeden Knoten π£ die folgenden zwei Zeitpunkte • π‘π£,1 : Zeitpunkt, wenn π£ in der DFS-Suche grau gefärbt wird • π‘π£,2 : Zeitpunkt, wenn π£ in der DFS-Suche schwarz gefärbt wird Theorem: Im DFS-Baum ist ein Knoten π£ genau dann im Teilbaum eines Knoten π’, falls das Intervall π‘π£,1 , π‘π£,2 vollständig im Intervall π‘π’,1 , π‘π’,2 enthalten ist. Zudem sind zwei Intervalle entweder disjunkt, oder das eine ist komplett im anderen enthalten. Beispiel: 1 2 3 4 5 7 Fabian Kuhn Informatik II, SS 2016 2 Klassifizierung der Kanten (bei DFS-Suche) Baumkanten: • (π’, π£) ist eine Baumkante, falls π£ von π’ aus entdeckt wird 2 8 1 Rückwärtskanten: • π’, π£ ist eine Rückwärtskante, falls π£ ein Vorgängerknoten von π’ ist Vorwärtskanten: • π’, π£ ist eine Vorwärtskante, falls π£ ein Nachfolgerknoten von π’ ist Querkanten: • Alle übrigen Kanten Fabian Kuhn 7 3 9 4 5 6 Informatik II, SS 2016 3 DFS – Eigenschaften Theorem: Bei einer DFS-Suche in ungerichteten Graphen ist jede Kante entweder eine Baumkante oder eine Rückwärtskante. Theorem: Ein gerichteter Graph hat genau dann keine Zyklen, falls es bei der DFS-Suche keine Rückwärtskanten gibt. Fabian Kuhn Informatik II, SS 2016 4 Anwendung: Topologische Sortierung Zyklenfreie, gerichtete Graphen: • DAG: directed acyclic graph • Modellieren z.B. zeitliche Abhängigkeiten von Aufgaben • Beispiel: Anziehen von Kleidungsstücken Unterhemd Pullover Mantel Unterhose Hose Schuhe Brille Socken Topologische Sortierung: • Sortiere die Knoten eines DAGs so, dass π’ vor π£ erscheint, falls ein gerichteter Pfad von π’ nach π£ existiert • Im Beispiel: Finde eine mögliche Anziehreihenfolge Fabian Kuhn Informatik II, SS 2016 5 Topologische Sortierung: Etwas formaler… Zyklenfreie, gerichtete Graphen: • repräsentieren partielle Ordnungsrelationen – asymmetrisch: π<π βΉ ¬ π<π transitiv: π<π ∧ π<π βΉ π<π – partielle Ordnung: nicht alle Paare müssen vergleichbar sein • Beispiel: Teilmengenrelation bei Mengen Topologische Sortierung: • Sortiere die Knoten eines DAGs so, dass π’ vor π£ erscheint, falls ein gerichteter Pfad von π’ nach π£ existiert • Erweitere eine partielle Ordnung zu einer totalen Ordnung Fabian Kuhn Informatik II, SS 2016 6 Topologische Sortierung: Algorithmus Führe DFS aus… 2 1 3 7 6 11 5 4 8 12 9 13 10 14 π‘1,1 , π‘2,1 , π‘3,1 , π‘9,1 , π‘10,1 , πππ,π , π‘5,1 , ππ,π , ππ,π , ππ,π , π‘7,1 , π‘8,1 , π‘4,1 , ππ,π , ππ,π , ππ,π , ππ,π , π‘6,1 , ππ,π , ππ,π , π‘11,1 , πππ,π , π‘12,1 , π‘13,1 , π‘14,1 , πππ,π , πππ,π , πππ,π Beobachtung: • Knoten ohne Nachfolger werden als erstes besucht (schwarz gef.) • Besuchreihenfolge ist umgekehrte topologische Sortierung Fabian Kuhn Informatik II, SS 2016 7 Topologische Sortierung: Algorithmus Theorem: Umgekehrte “Visit”-Reihenfolge (schwarz färben) der Knoten bei DFS-Traversierung ergibt topologische Sortierung Fabian Kuhn Informatik II, SS 2016 8 DFS-Traversierung: Weitere Anwendungen Stark zusammenhängende Komponenten • Stark zus.-hängende Komponente eines gerichteten Graphen: “Maximale Knoten-Teilmenge, so dass jeder jeden erreichen kann” Bild: Wikipedia • Kann man mit 2 DFS-Traversierungen finden (Zeit ∈ π π + π ) – auf πΊ und auf πΊ π (alle Kanten umgedreht) – πΊ und πΊ π haben die gleichen stark zus.-hängenden Komponenten • Details z.B. in [CLRS] Fabian Kuhn Informatik II, SS 2016 9 DFS-Traversierung: Weitere Anwendungen Artikulationsknoten, Brücken, Biconnected Components • Annahme: ungerichteter Graph • Artikulationsknoten π: π£ entfernen vergrössert die Anzahl Komponenten • Brücke π: Kante π entfernen vergrössert die Anzahl Komponenten Fabian Kuhn Informatik II, SS 2016 10 DFS-Traversierung: Weitere Anwendungen Biconnected Components • Komponenten, welche übrig bleiben, wenn man alle Brücken entfernt Bild: [CLRS] • Artikulationsknoten und Brücken können mit einer DFSTraversierung in π π + π Zeit gefunden werden – Algorithmus von Hopcroft, Tarjan (1973) • Zerlegung in Biconnected Components daher in der gleichen Zeit Fabian Kuhn Informatik II, SS 2016 11 Bäume • Als ungerichtete Graphen (mit π Knoten) betrachtet… Baum: • Zusammenhängender ungerichteter Graph, ohne Zyklen – Ein nicht zus.-hängender zyklenfreier (unger.) Graph heisst Wald – Anzahl Kanten: π − 1 (jede Kante reduziert die #Komponenten um 1) Äquivalente Definitionen: • Minimaler zusammenhängender Graph • Maximaler zyklenfreier Graph • Eindeutiger Pfad zwischen jedem Knotenpaar • Zusammenhängender Graph mit π − 1 Kanten Fabian Kuhn Informatik II, SS 2016 12 Spannbaum Gegeben: Zusammenhängender, ungerichteter Graph πΊ = π, πΈ Spannbaum π» = π½, π¬π» : Teilgraph (πΈπ ⊆ πΈ) • π ist ein Baum ist, welcher alle Knoten von πΊ enthält • Alternativ: π ist ein Baum mit π − 1 Kanten aus πΈ 1 2 8 3 4 5 6 Fabian Kuhn Informatik II, SS 2016 7 13 Minimaler Spannbaum Gegeben: Zus.-hängender, ungerichteter Graph πΊ = π, πΈ, π€ mit Kantengewichten π€ βΆ πΈ → β Minimaler Spannbaum π» = π½, π¬π» : • Spannbaum mit kleinstem Gesamtgewicht 1 1 2 3 3 9 3 15 7 8 4 2 6 1 6 5 8 Fabian Kuhn 6 9 Informatik II, SS 2016 7 14 Minimale Spannbäume Ziel: Gegeben ein gewichteter, ungerichteter Graph πΊ, finde einen Spannbaum mit minimalem Gesamtgewicht. • Minimaler Spannbaum = Minimum Spanning Tree = MST • Ein grundlegendes Optimierungsproblem auf Graphen – eines von sehr vielen Optimierungsproblemen auf Graphen • kommt oft als Teilproblem vor • ist aber auch interessant an sich Fabian Kuhn Informatik II, SS 2016 15 Basis-MST-Algorithmus Idee: Starte mit leerer Kantenmenge und füge die Kanten schrittweise hinzu, bis es ein Spannbaum ist Invariante: Algorithmus hat zu jeder Zeit eine Kantenmenge π΄, so dass π΄ Teilmenge eines minimalen Spannbaums ist. • Am Anfang ist π΄ = ∅ • Danach wird jeweils eine Kante hinzugefügt, ohne die Invariante zu verletzen • Wir nennen eine Kante, für welche wir sicher sein können, dass wir sie zu π΄ hinzufügen können eine sichere Kante für π΄ • Wie man sichere Kanten findet, werden wir sehen… Fabian Kuhn Informatik II, SS 2016 16 Basis-MST-Algorithmus Invariante: Algorithmus hat zu jeder Zeit eine Kantenmenge π΄, so dass π΄ Teilmenge eines minimalen Spannbaums ist. Basis-MST-Algorithmus: π΄ = ∅ while π΄ ist kein Spannbaum do Finde sichere Kante π’, π£ für π΄ π΄ = π΄ ∪ π’, π£ return π΄ • Invariante ist eine gültige Schleifeninvariante • Invariante + Abbruchbedingung βΉ π΄ ist ein MST! Fabian Kuhn Informatik II, SS 2016 17 Wie findet man sichere Kanten? • Invariante ο es gibt immer mindestens eine sicher Kante – π΄ ist Teilmenge eines MST und kann daher zu einem MST erweitert werden • Zuerst benötigen wir ein paar Begriffe… Schnitt πΊ, π½ β πΊ : • Kante π’, π£ ∈ πΈ ist eine Schnittkante bezüglich π, π β π , falls ein Ende in π und ein Ende in π β π ist. • Wir nennen Kante π’, π£ eine leichte Schnittkante bez. π, π β π , falls sie das kleinste Gewicht von allen Schnittkanten hat Fabian Kuhn Informatik II, SS 2016 18 Sichere Kanten Annahmen: • πΊ = π, πΈ, π€ ist zus.-h., unger. Graph mit Kantengewichten π€ π • π΄ ist Teilmenge (Teilgraph) eines MST Theorem: Sei π, π β π ein Schnitt, so dass π΄ keine Schnittkanten enthält und sei π’, π£ , π’ ∈ π, π£ ∈ π β π eine leichte Schnittkante bezüglich π, π β π . Dann ist π’, π£ eine sichere Kante für π΄. 1 1 2 15 3 9 3 3 7 8 4 2 6 6 1 5 8 Fabian Kuhn 6 9 7 Informatik II, SS 2016 19 Sichere Kanten Theorem: Sei π, π β π ein Schnitt, so dass π΄ keine Schnittkanten enthält und sei π’, π£ , π’ ∈ π, π£ ∈ π β π eine leichte Schnittkante bezüglich π, π β π . Dann ist π’, π£ eine sichere Kante für π΄. Fabian Kuhn Informatik II, SS 2016 20 Sichere Kanten Theorem: Sei π, π β π ein Schnitt, so dass π΄ keine Schnittkanten enthält und sei π’, π£ , π’ ∈ π, π£ ∈ π β π eine leichte Schnittkante bezüglich π, π β π . Dann ist π’, π£ eine sichere Kante für π΄. Fabian Kuhn Informatik II, SS 2016 21 Kruskal’s MST-Algorithmus π΄ = ∅ while π΄ ist π = π’, π£ so dass π΄ = π΄∪ kein Spannbaum do ist Kante mit kleinstem Gewicht, π΄ ∪ π’, π£ keinen Zyklus enthält π’, π£ • Wir müssen zeigen, dass π eine sichere Kante für π΄ ist Fabian Kuhn Informatik II, SS 2016 22 Kruskal’s MST-Algorithmus: Beispiel 1 3 13 6 10 23 4 14 21 2 7 28 31 16 17 9 19 25 12 8 20 18 Fabian Kuhn 11 Informatik II, SS 2016 23 Kruskal’s MST-Algorithmus: Bemerkungen Kruskal’s Algorithmus berechnet minimalen Spannbaum • Die hinzugefügte Kante ist in jedem Schritt sicher • Wir haben gesehen, dass der Basis-Algorithmus korrekt ist Kruskal’s Algorithmus ist ein typisches Beispiel eines sogenannten Greedy Algorithmus • Wir beginnen mit einer leeren Kantenmenge • In jedem Schritt wird die im Moment beste Kante hinzugenommen • Eine gewählte Kante wird nie wieder verworfen • Wir werden noch kurz besprechen, wie man den Algorithmus effizient implementieren kann... Fabian Kuhn Informatik II, SS 2016 24 Implementierung Kruskals Algorithmus Kruskals Algorithmus (Pseudo-Code) 1. π΄ = ∅ 2. Sortiere Kanten aufsteigend nach Kantengewicht 3. for π = π’, π£ ∈ πΈ (in sorted order) do 4. if π’ and π£ are in different components then 5. π΄ = π΄∪ π Fabian Kuhn Informatik II, SS 2016 25 Implementierung Kruskals Algorithmus Kruskals Algorithmus (Pseudo-Code) 1. π΄ = ∅ 2. Sortiere Kanten aufsteigend nach Kantengewicht 3. for π = π’, π£ ∈ πΈ (in sorted order) do 4. if π’ and π£ are in different components then 5. π΄ = π΄∪ π • Müssen Komponenten des durch π΄ bestimmten Graphen effizient verwalten können • Laufzeit: π π log π für’s Sortieren, sowie die Gesamtzeit, um die Komponenten zu verwalten… Fabian Kuhn Informatik II, SS 2016 26 Union-Find / Disjoint Sets Datentyp Verwaltet eine Partition von Elementen Operationen: • create • U.makeSet(x) • U.find(x) • U.union(S1, S2) : erzeugt eine leere Union-Find-DS : fügt Menge {π₯} zur Partition hinzu : gibt Menge mit Element π₯ zurück : vereinigt die Mengen π1 und π2 • Details dazu werden in der Algorithmentheorie besprochen… Fabian Kuhn Informatik II, SS 2016 27 Kruskal mit Union-Find Kruskals Algorithmus 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. π΄ = ∅ U = create new for all π’ ∈ π do U.makeSet(π’) Sortiere Kanten aufsteigend nach Kantengewicht for all π = π’, π£ ∈ πΈ (in sorted order) do ππ’ = U.find(π’); ππ£ = U.find(π£) if ππ’ ≠ ππ£ then π΄ = π΄∪ π U.union(ππ’ ,ππ£ ) Fabian Kuhn Informatik II, SS 2016 28 Kruskal: Laufzeitanalyse Beste Union-Find Datenstruktur • Laufzeit für π Union-Find-Operationen auf π Elementen (π makeSet-Operationen): πΆ π ⋅ πΆ π, π • πΌ π, π ist die Inverse der Ackermannfunktion und wächst extrem langsam (für alle halbwegs vernünftigen π, π, πΌ π, π ≤ 5) Laufzeit Kruskal • Kanten sortieren: π π ⋅ log π • Union-Find-Operationen: π π ⋅ πΌ π, π • Insgesamt: π π ⋅ log π – besser, falls Kantengewichte schneller sortiert werden können Fabian Kuhn Informatik II, SS 2016 29 MST Eindeutigkeit • Im Allgemeinen ist der MST nicht eindeutig Satz: Bei paarweise verschiedenen Kantengewichten ist der MST eindeutig. Fabian Kuhn Informatik II, SS 2016 30