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