3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei

Werbung
3.1 Konstruktion von minimalen Spannbäumen
Es gibt zwei Prinzipien für die Konstruktion von minimalen
Spannbäumen (Tarjan):
blaue“ Regel
”
rote“ Regel
”
EADS
ľErnst W. Mayr
3.1 Konstruktion von minimalen Spannbäumen
416/436
Satz 100
Sei G = (V, E) ein zusammenhängender ungerichteter Graph,
w : E → R eine Gewichtsfunktion, C = (V1 , V2 ) ein Schnitt (d.h.
V = V1 ∪ V2 , V1 ∩ V2 = ∅, V1 6= ∅ =
6 V2 ). Sei weiter
EC = E ∩ (V1 × V2 ) die Menge der Kanten über den Schnitt
”
hinweg“. Dann gilt: ( blaue“ Regel)
”
1 Ist e ∈ E
C die einzige Kante minimalen Gewichts (über alle
Kanten in EC ), dann ist e in jedem minimalen Spannbaum für
(G,w) enthalten.
2
Hat e ∈ EC minimales Gewicht (über alle Kanten in EC ),
dann gibt es einen minimalen Spannbaum von (G,w), der e
enthält.
EADS
ľErnst W. Mayr
3.1 Konstruktion von minimalen Spannbäumen
417/436
Beweis:
[durch Widerspruch]
1
Sei T ein minimaler Spannbaum von (G, w), sei e ∈ EC die
minimale Kante. Annahme: e ∈
/ T . Da T Spannbaum
⇒ T ∩ EC 6= ∅.
Sei T ∩ EC = {e1 , e2 , . . . , ek }, k ≥ 1. Dann enthält T ∪ {e}
einen eindeutig bestimmten Kreis (den sogenannten durch e
bzgl. T bestimmten Fundamentalkreis). Dieser Kreis muss
mindestens eine Kante ∈ EC ∩ T enthalten, da die beiden
Endpunkte von e auf verschiedenen Seiten des Schnitts C
liegen.
EADS
ľErnst W. Mayr
3.1 Konstruktion von minimalen Spannbäumen
418/436
Beweis (Forts.):
rA
rA
rA
V1
e0
e
r
j
V2
r
j
r
j
Tr
HH
HrA
HH
r
j
H
0
rA
e
@
@j
r
rA
@
r
@
r
e
A
@
@
Sei e0 ∈ EC ∩ T . Dann gilt nach Voraussetzung w(e0 ) > w(e). Also
ist T 0 := T − {e0 } ∪ {e} ein Spannbaum von G, der echt kleineres
Gewicht als T hat, Widerspruch zu T ist minimaler
”
Spannbaum“.
EADS
ľErnst W. Mayr
3.1 Konstruktion von minimalen Spannbäumen
419/436
Beweis (Forts.):
2
Sei e ∈ EC minimal. Annahme: e kommt in keinem minimalen
Spannbaum vor. Sei T ein beliebiger minimaler Spannbaum
von (G, w).
r
j
r
V1
r
j
e
r
j
V2
r
j
r
e∈
/ T ∩ Ec 6= ∅
e∈
/ T ∩ EC 6= ∅. Sei e0 ∈ EC ∩ T eine Kante auf dem durch e
bezüglich T erzeugten Fundamentalkreis. Dann ist
T 0 = T − {e0 } ∪ {e} wieder ein Spannbaum von G, und es ist
w(T 0 ) ≤ w(T ). Also ist T 0 minimaler Spannbaum und e ∈ T 0 .
EADS
ľErnst W. Mayr
3.1 Konstruktion von minimalen Spannbäumen
420/436
Satz 101
Sei G = (V, E) ein ungerichteter, gewichteter,
zusammenhängender Graph mit Gewichtsfunktion w : E → R.
Dann gilt: ( rote“ Regel)
”
1 Gibt es zu e ∈ E einen Kreis C in G, der e enthält und
w(e) > w(e0 ) für alle e0 ∈ C \ {e} erfüllt, dann kommt e in
keinem minimalen Spannbaum vor.
2
Ist C1 = e1 , . . . , ek ein Kreis in G und
w(ei ) = max{w(ej ); 1 ≤ j ≤ k}, dann gibt es einen
minimalen Spannbaum, der ei nicht enthält.
EADS
ľErnst W. Mayr
3.1 Konstruktion von minimalen Spannbäumen
421/436
Beweis:
1
Nehmen wir an, dass es einen minimalen Spannbaum T gibt,
der e = {v1 , v2 } enthält. Wenn wir e aus T entfernen, so
zerfällt T in zwei nicht zusammenhängende Teilbäume T1 und
T2 mit vi ∈ Ti , i = 1, 2. Da aber e auf einem Kreis in G liegt,
muss es einen Weg von v1 nach v2 geben, der e nicht benützt.
Mithin gibt es eine Kante ê 6= e auf diesem Weg, die einen
Knoten in T1 mit T2 verbindet. Verbinden wir T1 und T2
entlang ê, so erhalten wir einen von T verschiedenen
Spannbaum T̂ . Wegen w(ê) < w(e) folgt w(T̂ ) < w(T ), im
Widerspruch zur Minimalität von T .
EADS
ľErnst W. Mayr
3.1 Konstruktion von minimalen Spannbäumen
422/436
Beweis (Forts.):
2
Wir nehmen an, ei liege in jedem minimalen Spannbaum
(MSB) von G, und zeigen die Behauptung durch Widerspruch.
Sei T ein beliebiger MSB von G. Entfernen wir ei aus T , so
zerfällt T in zwei nicht zusammenhängende Teilbäume T1 und
T2 . Da ei auf einem Kreis C1 = e1 , . . . , ek in G liegt, können
wir wie zuvor ei durch eine Kante ej des Kreises C1 ersetzen,
die T1 und T2 verbindet. Dadurch erhalten wir einen von T
verschiedenen Spannbaum T̃ , der ei nicht enthält. Da nach
Voraussetzung w(ej ) ≤ w(ei ) gilt, folgt w(T̃ ) ≤ w(T ) (und
sogar w(T̃ ) = w(T ), da T nach Annahme ein MSB ist). Also
ist T̃ ein MSB von G, der ei nicht enthält, im Widerspruch
zur Annahme, ei liege in jedem MSB von G.
EADS
ľErnst W. Mayr
3.1 Konstruktion von minimalen Spannbäumen
423/436
Literatur
Robert E. Tarjan:
Data Structures and Network Algorithms
SIAM CBMS-NSF Regional Conference Series in Applied
Mathematics Bd. 44 (1983)
EADS
ľErnst W. Mayr
3.1 Konstruktion von minimalen Spannbäumen
424/436
3.2 Generischer minimaler Spannbaum-Algorithmus
Initialisiere Wald F von Bäumen, jeder Baum ist ein singulärer
Knoten
(jedes v ∈ V bildet einen Baum)
while Wald F mehr als einen Baum enthält do
wähle einen Baum T ∈ F aus
bestimme eine leichteste Kante e = {v, w} aus T heraus
sei v ∈ T , w ∈ T 0
vereinige T und T 0 , füge e zum minimalen Spannbaum hinzu
od
EADS
ľErnst W. Mayr
3.2 Generischer minimaler Spannbaum-Algorithmus
425/436
Generischer MST-Algorithmus
0
T
T
#
#
q
q
q
qHHq
q q q
"!
"!
Wald F
V1
EADS
ľErnst W. Mayr
00
000
T
T
#
#
q
q
q
q
q
q
"!
"!
V2
3.2 Generischer minimaler Spannbaum-Algorithmus
426/436
3.3 Kruskals Algorithmus
algorithm Kruskal (G, w) :=
sortiere die Kanten nach aufsteigendem Gewicht in eine Liste L
initialisiere Wald F = {Ti , i = 1, . . . , n}, mit Ti = {vi }
MSB:=∅
for i := 1 to length(L) do
{v, w} := Li
x := Baum ∈ F , der v enthält; co x :=Find(v) oc
y := Baum ∈ F , der w enthält; co y :=Find(w) oc
if x 6= y then
MSB:=MSB ∪ {{v, w}}
Union(x, y) co gewichtete Vereinigung oc
fi
od
EADS
ľErnst W. Mayr
3.3 Kruskals Algorithmus
427/436
Korrektheit: Falls die Gewichte eindeutig sind (w(·) injektiv), folgt
die Korrektheit direkt mit Hilfe der “blauen“ und “roten“ Regel.
Ansonsten Induktion über die Anzahl |V | der Knoten:
√
Ind. Anfang: |V | klein:
Sei r ∈ R, Er := {e ∈ E; w(e) < r}.
Es genügt zu zeigen:
Sei T1 , . . . , Tk ein minimaler Spannwald für Gr := {V, Er } (d.h.,
wir betrachten nur Kanten mit Gewicht < r). Sei weiter T ein
MSB von G, dann gilt die
Hilfsbehauptung: Die Knotenmenge eines jeden Ti induziert in T
einen zusammenhängenden Teilbaum, dessen Kanten alle Gewicht
< r haben.
EADS
ľErnst W. Mayr
3.3 Kruskals Algorithmus
428/436
Beweis der Hilfsbehauptung:
Sei Ti =: (Vi , Ei ). Wir müssen zeigen, dass Vi in T einen
zusammenhängenden Teilbaum induziert. Seien u, v ∈ Vi zwei
Knoten, die in Ti durch eine Kante e verbunden sind. Falls der
Pfad in T zwischen u und v auch Knoten 6∈ Vi enthält (also der
von Vi induzierte Teilgraph von T nicht zusammenhängend ist),
dann enthält der in T durch Hinzufügen der Kante e entstehende
Fundamentalkreis notwendigerweise auch Kanten aus E \ Er und
ist damit gemäß der “roten“ Regel nicht minimal! Da Ti
zusammenhängend ist, folgt damit, dass je zwei Knoten aus Vi in
T immer durch einen Pfad verbunden sind, der nur Kanten aus Er
enthält.
EADS
ľErnst W. Mayr
3.3 Kruskals Algorithmus
429/436
Zeitkomplexität: (mit n = |V |, m = |E|)
Sortieren
O(m) Find-Operationen
n − 1 Unions
m log m = O(m log n)
O(m log n)
O(n log n)
Satz 102
Kruskal’s MSB-Algorithmus hat die Zeitkomplexität
O((m + n) log n).
Beweis:
s.o.
EADS
ľErnst W. Mayr
3.3 Kruskals Algorithmus
430/436
Beispiel 103 (Kruskals Algorithmus)
t
8
7
t
9
2
4
t
t 11
7
8
t
t
4
6
1
t
14 t
t
10
2
minimaler
Spannbaum
8
7
t
t
t
6h
4
2
9
4h
2h
8h
5h
t 11
t
14 t
4
h
7
6
7
10
8
1h t 3h t
t
1
2
⇓
EADS
ľErnst W. Mayr
3.3 Kruskals Algorithmus
431/436
3.4 Prim’s Algorithmus
algorithm PRIM-MSB (G, w) :=
initialisiere Priority Queue PQ mit Knotenmenge V und
Schlüssel +∞, ∀v ∈ V
wähle Knoten r als Wurzel (beliebig)
Schlüssel k[r] := 0
Vorgänger[r] := nil
while P Q 6= ∅ do
u := ExtractMin(P Q)
for alle Knoten v, die in G zu u benachbart sind do
if v ∈ P Q and w({u, v}) < k[v] then
Vorgänger[v] := u
k[v] := w({u, v})
fi
od
od
EADS
ľErnst W. Mayr
3.4 Prim’s Algorithmus
432/436
Beispiel 104 (Prim’s Algorithmus)
+∞
t
v7
4
2
v0 t
11
0
8
+∞ 7
t
v6
8
+∞
tv8
7
t v1
+∞ 1
EADS
ľErnst W. Mayr
6
tv2
+∞
+∞
t
v5
9
14
4
2
10
t v3
+∞
Ausgangszustand:
+∞
alle Schlüssel = +∞
t
t
v4
aktueller Knoten u: i
Startknoten: r (= v0 )
433/436
Beispiel 104 (Prim’s Algorithmus)
+∞
t
v7
4
2
v0 t
11
0
8
+∞
tv8
6
7
t v1
+∞ 1
4
t
v7
v0 i
t 11
2
+∞ 7
t
v6
2
+∞
tv8
7
t v1
1
8
EADS
ľErnst W. Mayr
6
tv2
+∞
+∞
t
v5
9
14
4
tv2
+∞
8
4
8
+∞ 7
t
v6
8
4
2
10
t v3
+∞
+∞
t
v5
Ausgangszustand:
+∞
alle Schlüssel = +∞
t
t
v4
aktueller Knoten u: i
Startknoten: r (= v0 )
suche u := FindMin(P Q)
und entferne u aus P Q
+∞ setze Schlüssel der Nach14 tv
barn in P Q mit
4
w({u, v}) < Schlüssel[v]:
10
(v1 = 8, v7 = 4)
t v3
+∞
9
433/436
Beispiel 104 (Prim’s Algorithmus)
4
t
v7
4
v0 i
t 11
+∞ 7
t
v6
8
2
+∞
tv8
8
1
v0 t
11
t v1
1
8
t
i
v7
tv2
+∞
2
8
t
7
8
v6
2
+∞
tv8
7
8
4
6
7
t v1
1
8
EADS
ľErnst W. Mayr
6
tv2
+∞
4
2
+∞
t
v5
suche u := FindMin(P Q)
und entferne u aus P Q
setze
Schlüssel der Nach+∞
14 tv
barn in P Q mit
4
w({u, v}) < Schlüssel[v]:
10
(v1 = 8, v7 = 4)
t v3
+∞
+∞
t
v5
9
suche u := FindMin(P Q)
und entferne u aus P Q
+∞ setze Schlüssel der Nach14 tv
barn in P Q mit
4
w({u, v}) < Schlüssel[v]:
10
(v6 = 8)
t v3
+∞
9
433/436
Beispiel 104 (Prim’s Algorithmus)
1
v0 t
11
i
t
v7
8
t
8
2
+∞
tv8
7
8
1
t
v7
4
6
t v1
1
8
tv2
+∞
2
2
7
i
t
v6
2
2
tv8
v0 t
11
7
8
7
v6
t v1
1
8
EADS
ľErnst W. Mayr
6
tv2
+∞
4
2
+∞
t
v5
suche u := FindMin(P Q)
und entferne u aus P Q
+∞ setze Schlüssel der Nach14 tv
barn in P Q mit
4
w({u, v}) < Schlüssel[v]:
10
(v6 = 8)
t v3
+∞
9
7
t
suche u := FindMin(P Q)
und entferne u aus P Q
+∞ setze Schlüssel der Nach14 tv
barn in P Q mit
4
w({u, v}) < Schlüssel[v]:
10
(v3 = 4, v5 = 7, v8 = 2)
t v3
4
v5
9
433/436
Beispiel 104 (Prim’s Algorithmus)
1
t
v7
2
7
i
t
v6
1
2
t
v7
t
7
7
t
4
6
t v1
1
8
v0 t
11
2
3
v6
tiv8
7
8
tv2
+∞
2
tv8
7
8
suche u := FindMin(P Q)
und entferne u aus P Q
+∞ setze Schlüssel der Nach14 tv
barn in P Q mit
4
w({u, v}) < Schlüssel[v]:
10
(v3 = 4, v5 = 7, v8 = 2)
t v3
4
2
v0 t
11
t v1
1
7
EADS
ľErnst W. Mayr
7
t
v5
tv2
6
suche u := FindMin(P Q)
und entferne u aus P Q
+∞ setze Schlüssel der Nach14 tv
barn in P Q mit
4
w({u, v}) < Schlüssel[v]:
10
(v1 = 7, v2 = 6)
t v3
4
v5
4
6
2
9
9
433/436
Beispiel 104 (Prim’s Algorithmus)
1
t
v7
v0 t
11
2
1
2
t
v7
t
7
7
t
4
6
t v1
1
7
2
3
v6
v5
tv8
7
t v1
1
7
EADS
ľErnst W. Mayr
7
t
v5
tv2
6
v6
tiv8
v0 t
11
8
7
suche u := FindMin(P Q)
und entferne u aus P Q
+∞ setze Schlüssel der Nach14 tv
barn in P Q mit
4
w({u, v}) < Schlüssel[v]:
10
(v1 = 7, v2 = 6)
t v3
4
3
7
8
t
9
9
14
4
6
tv2
2
2
10
iv3
t
t10
v4
suche u := FindMin(P Q)
und entferne u aus P Q
setze Schlüssel der Nachbarn in P Q mit
w({u, v}) < Schlüssel[v]:
(v2 = 2, v4 = 10)
433/436
Beispiel 104 (Prim’s Algorithmus)
1
t
v7
v0 t
11
2
3
1
7
t
v5
t
v7
4
6
2
3
tv2
2
2
t
7
v6
7
t v1
1
1
EADS
ľErnst W. Mayr
7
t
9
14
4
6
10
t v3
v2
ti
t10
v4
suche u := FindMin(P Q)
und entferne u aus P Q
setze Schlüssel der Nachbarn in P Q mit
w({u, v}) < Schlüssel[v]:
(v1 = 1)
10
iv3
t
v5
tv8
t10
v4
suche u := FindMin(P Q)
und entferne u aus P Q
setze Schlüssel der Nachbarn in P Q mit
w({u, v}) < Schlüssel[v]:
(v2 = 2, v4 = 10)
9
14
t v1
1
7
v0 t
11
8
7
v6
tv8
7
8
t
5
433/436
Beispiel 104 (Prim’s Algorithmus)
1
t
v7
v0 t
11
2
3
1
7
t
v5
t
v7
10
t v3
v2
ti
t
3
7
v6
EADS
ľErnst W. Mayr
7
t
v5
tv8
9
14
4
6
10
t v3
tv2
6
suche u := FindMin(P Q)
und entferne u aus P Q
setze Schlüssel der Nachbarn in P Q mit
w({u, v}) < Schlüssel[v]:
(v1 = 1)
5
2
t v1
i
t10
v4
4
6
7
9
14
t v1
1
1
v0 t
11
8
7
v6
tv8
7
8
t
t10
v4
suche u := FindMin(P Q)
und entferne u aus P Q
setze Schlüssel der Nachbarn in P Q mit
w({u, v}) < Schlüssel[v]:
solche Nachbarn existieren
nicht
5
433/436
Beispiel 104 (Prim’s Algorithmus)
1
t
v7
v0 t
11
2
3
7
v6
v0 t
11
10
t v3
tv2
8
t
3
7
v6
v5
tv8
EADS
ľErnst W. Mayr
9
4
10
t v3
tv2
6
i
t
14
6
t v1
suche u := FindMin(P Q)
und entferne u aus P Q
setze Schlüssel der Nachbarn in P Q mit
w({u, v}) < Schlüssel[v]:
solche Nachbarn existieren
nicht
5
2
7
t10
v4
4
6
tiv1
t
v7
9
14
6
1
7
t
v5
tv8
7
8
t
t9
v4
suche u := FindMin(P Q)
und entferne u aus P Q
setze Schlüssel der Nachbarn in P Q mit
w({u, v}) < Schlüssel[v]:
(v4 = 9)
5
433/436
Beispiel 104 (Prim’s Algorithmus)
1
t
v7
v0 t
11
2
3
7
v6
v0 t
11
8
t
3
7
v6
v5
tv8
EADS
ľErnst W. Mayr
t
8
14
4
6
i
t
v4
10
t v3
tv2
6
suche u := FindMin(P Q)
und entferne u aus P Q
setze Schlüssel der Nachbarn in P Q mit
w({u, v}) < Schlüssel[v]:
(v4 = 9)
5
2
t v1
t9
v4
10
t v3
tv2
7
9
4
6
t v1
t
v7
i
t
14
6
1
v5
tv8
7
8
t
Endzustand:
suche u := FindMin(P Q)
und entferne u aus P Q,
damit ist P Q leer und der
Algorithmus beendet
5
3.4 Prim’s Algorithmus
433/436
Korrektheit: ist klar.
Zeitkomplexität:
n ExtractMin
O(m) sonstige Operationen inclusive DecreaseKey
Implementierung der Priority Queue mittels Fibonacci-Heaps:
Initialisierung
ExtractMins
DecreaseKeys
Sonstiger Overhead
EADS
ľErnst W. Mayr
O(n)
O(n log n) (≤ n Stück)
O(m) (≤ m Stück)
O(m)
3.4 Prim’s Algorithmus
434/436
Satz 105
Sei G = (V, E) ein ungerichteter Graph (zusammenhängend,
einfach) mit Kantengewichten w. Prim’s Algorithmus berechnet,
wenn mit Fibonacci-Heaps implementiert, einen minimalen
Spannbaum von (G, w) in Zeit O(m + n log n) (wobei
n = |V |, m = |E|). Dies ist für m = Ω(n log n) asymptotisch
optimal.
Beweis:
s.o.
EADS
ľErnst W. Mayr
3.4 Prim’s Algorithmus
435/436
EADS
ľErnst W. Mayr
3.4 Prim’s Algorithmus
436/436
Herunterladen