Union-Find

Werbung
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
Herunterladen