3.5 Prim’s Algorithmus, zweite Variante
Die Idee der folgenden Variante von Prim’s Algorithmus ist:
Lasse die Priority Queues nicht zu groß werden.
Seien dazu G = (V, E), |V | = n, |E| = m, w Gewichtsfunktion, und k ein Parameter, dessen Wert wir erst sp¨ ater festlegen werden.
Der Algorithmus arbeitet nun in
Phasenwie folgt:
1
Initialisiere eine Schlange von B¨ aumen, jeder Baum anfangs ein (Super-) Knoten. Zu jedem Baum initialisiere eine Priority Queue (Fibonacci-Heap) mit den Nachbarn der Knoten im Baum, die selbst nicht im Baum sind, als Elementen und jeweils dem Gewicht einer leichtesten Kante zu einem Knoten im Baum als Schl¨ ussel.
2
Markiere jeden Baum in der Schlange mit der Nummer der laufenden Phase.
EADS 3.5 Prim’s Algorithmus, zweite Variante 436/455
ľErnst W. Mayr
3
while vorderster Baum in der Schlange hat laufende Phasennummer do
lasse ihn wachsen, solange seine Priority Queue h¨ ochstens k Elemente enth¨ alt (und noch etwas zu tun ist) if Priority Queue zu groß (mehr als k Elemente) then
f¨ uge Baum mit inkrementierter Phasennummer am Ende der Schlange ein
fi od
4
Falls
” Phasensprung“: Schrumpfe alle B¨ aume zu Superknoten, reduziere Kantenmenge (d.h., behalte zwischen zwei Knoten jeweils nur die leichteste Kante)
5
Beginne n¨ achste Phase mit Schritt 1.!
EADS 3.5 Prim’s Algorithmus, zweite Variante 437/455
ľErnst W. Mayr
t t t t t t t
I
Ende-
markierung wenn groß genug
hinten anstellen
j
...
Ende- markierung
t t t t t t t
?
falls
Phasensprung schrumpfen und
n¨ achste Phase
?
EADS 3.5 Prim’s Algorithmus, zweite Variante 438/455
ľErnst W. Mayr
Analyse des Zeitbedarfs:
Sei t die Anzahl der B¨ aume in der Schlange zu Beginn einer Phase.
Betrachte die Schlange von B¨ aumen:
T
1T
2· · · T
i· · · T
tr
r @@r
r
r
v
Abgesehen von den Operationen, die bei der Vereinigung von Superknoten anfallen, betr¨ agt der Zeitaufwand pro Phase O(m).
EADS 3.5 Prim’s Algorithmus, zweite Variante 439/455
ľErnst W. Mayr
Vereinigung zweier Superknoten, z.B. T
1und T
2: F¨ ur jeden (Super-)Knoten v in T
2’s Priority Queue:
1
v ∈ T
1: √
(nichts zu tun)
2
v in Priority Queue von T
1: DecreaseKey. Hilfsdatenstruktur:
f¨ ur alle Knoten in den Priority Queues ein Zeiger auf den Superknoten, in dessen Priority Queue der Knoten letztmals am Anfang der Schlange stand.
3
sonst: Einf¨ ugen
EADS 3.5 Prim’s Algorithmus, zweite Variante 440/455
ľErnst W. Mayr
Betrachte Knoten mit
” Halbkanten“: jede Halbkante kommt nur 1x in allen B¨ aumen der Queue vor. Mit m Kanten ergeben sich 2m Halbkanten.
m
Kanten 2m
Halbkanten
Kante aus zwei Halbkanten
rv
re →
v
re
und
re
=
b rv
re
EADS 3.5 Prim’s Algorithmus, zweite Variante 441/455
ľErnst W. Mayr
Zeitaufwand pro Phase (mit Bildung der Superknoten zu Beginn):
Initialisierung: O(m)
ExtractMin: < t Operationen
sonstige Priority Queue-Operationen, Overhead: Zeit O(m) Da die Priority Queues h¨ ochstens k Elemente enthalten, wenn darauf eine
” teure“ Priority Queue-Operation durchgef¨ uhrt wird, sind die Kosten pro Phase
O(t log k + m) .
Setze k = 2
2mt(damit t log k = 2m). Damit sind die Kosten pro Phase O(m).
EADS 3.5 Prim’s Algorithmus, zweite Variante 442/455
ľErnst W. Mayr
Wieviele Phasen f¨ uhrt der Algorithmus aus?
t ist die Anzahl der Superknoten am Anfang einer Phase, t
0sei diese Zahl zu Beginn der n¨ achsten Phase. Sei a die
durchschnittliche Anzahl urspr¨ unglicher Knoten in jeder der t Priority Queues zu Anfang der Phase, a
0entsprechend zu Beginn der n¨ achsten Phase.
Wir haben:
1
a =
2mt2
t
0≤
2mk(mit Ausnahme ev. der letzten Phase)
EADS 3.5 Prim’s Algorithmus, zweite Variante 443/455
ľErnst W. Mayr
Also:
a
0= 2m
t
0≥ k = 2
2mt= 2
aF¨ ur die erste Phase ist a =
2mn, f¨ ur jede Phase ist a ≤ n − 1. Also ist die Anzahl der Phasen
≤ 1 + min
i; log
(i)2(n − 1) ≤ 2m n
.
Setzen wir β(m, n) := min
ni; log
(i)2n ≤
mno, dann gilt
β(m, n) ≤ log
∗n f¨ ur n ≤ m ≤ n
2
.
EADS 3.5 Prim’s Algorithmus, zweite Variante 444/455
ľErnst W. Mayr
Satz 106
F¨ ur gewichtete, zusammenh¨ angende (ungerichtete) Graphen mit n Knoten, m Kanten kann ein minimaler Spannbaum in Zeit
O(min{m · β(m, n), m + n log n}) bestimmt werden.
EADS 3.5 Prim’s Algorithmus, zweite Variante 445/455
ľErnst W. Mayr
3.6 Erweiterungen
Euklidische
minimale Spannb¨ aume stellen ein Problem dar, f¨ ur das es speziellere Algorithmen gibt. Literatur hierzu:
Andrew Chih-Chi Yao:
On constructing minimum spanning trees in k-dimensional spaces and related problems
SIAM J. Comput.11(4), pp. 721–736 (1982)
EADS 3.6 Erweiterungen 446/455
ľErnst W. Mayr
Kapitel V K¨ urzeste Pfade
1. Grundlegende Begriffe
Betrachte Digraph G = (V, A) oder Graph G = (V, E).
Kante im ungerichteten
Graph
entgegengesetzte (antiparallele) Kanten
r r r r
=
b 6?
Distanzfunktion:
d
: A −→
R+(bzw. −→
R)
O.B.d.A.: A = V × V ,
d(x, y) = +∞f¨ ur Kanten, die eigentlich nicht vorhanden sind.
dis(v, w) := L¨ ange eines k¨ urzesten Pfades von v nach w
∈
R+∪ {+∞}.
EADS 1 Grundlegende Begriffe 447/455
ľErnst W. Mayr
Arten von K¨ urzeste-Pfade-Problemen:
1
single-pair-shortest-path (spsp). Beispiel: K¨ urzeste Entfernung von M¨ unchen nach Frankfurt.
2
single-source-shortest-path: gegeben G,
dund s ∈ V ,
bestimme f¨ ur alle v ∈ V die L¨ ange eines k¨ urzesten Pfades von s nach v (bzw. einen k¨ urzesten Pfad von s nach v) (sssp).
Beispiel: K¨ urzeste Entfernung von M¨ unchen nach allen anderen Großst¨ adten.
3
all-pairs-shortest-path (apsp). Beispiel: K¨ urzeste Entfernung zwischen allen Großst¨ adten.
Bemerkung: Es gibt keinen Algorithmus, der das
single-pair-shortest-path berechnet, ohne nicht gleichzeitig das single-source-shortest-path-Problem zu l¨ osen.
EADS 1 Grundlegende Begriffe 448/455
ľErnst W. Mayr
2. Das single-source-shortest-path-Problem
Zun¨ achst nehmen wir an, dass
d≥ 0 ist. Alle k¨ urzesten Pfade von a nach b sind o.B.d.A. einfache Pfade.
2.1 Dijkstra’s Algorithmus
Gegeben: G = (V, A), (A = V × V ), Distanzfunktion
d: A →
R+∪ {+∞}, Startknoten s, G durch Adjazenzlisten dar- gestellt.
A A A
C C C
r
r r
r r r r
r
s 0
EADS 2.1 Dijkstra’s Algorithmus 449/455
ľErnst W. Mayr
algorithm sssp:=
S := {s}; dis[s] := 0; initialisiere eine Priority Queue P Q, die alle Knoten v ∈ V \ {s} enth¨ alt mit Schl¨ ussel dis[v] :=
d(s, v)for alle v ∈ V − {s} do from[v] := s od
while S 6= V do
v := ExtractMin(P Q) S := S ∪ {v}
for alle w ∈ V \ S,
d(v, w)< ∞ do if dis[v] +
d(v, w)< dis[w] then
DecreaseKey(w, dis[v] +
d(v, w))co DecreaseKey aktualisiert dis[w] oc from[w] := v
fi od od
EADS 2.1 Dijkstra’s Algorithmus 450/455
ľErnst W. Mayr
Seien n = |V | und m = die Anzahl der wirklichen Kanten in G.
Laufzeit (mit Fibonacci-Heaps):
Initialisierung: O(n) ExtractMin: n · O(log n)
Sonstiger Aufwand: m · O(1) (z.B. DecreaseKey )
⇒ Zeitbedarf also: O(m + n log n)
EADS 2.1 Dijkstra’s Algorithmus 451/455
ľErnst W. Mayr
Korrektheit: Wir behaupten, dass in dem Moment, in dem ein v ∈ V \ {s} Ergebnis der ExtractMin Operation ist, der Wert dis[v]
des Schl¨ ussels von v gleich der L¨ ange eines k¨ urzesten Pfades von s nach v ist.
Beweis:
[durch Widerspruch] Sei v ∈ V \ {s} der erste Knoten, f¨ ur den diese Behauptung nicht stimmt, und sei
r -r -r
. . .
-r -r -r. . .
-r rs s
1s
2s
rv
1v
2v
qv
-ein k¨ urzester Pfad von s nach v, mit einer L¨ ange < dis[v]. Dabei sind s
1, . . . , s
r∈ S, v
1∈ / S [r = 0 und/oder q = 0 ist m¨ oglich].
Betrachte den Pfad s
r -s
1r. . .
-s
rr -v
1r; seine L¨ ange ist < dis[v], f¨ ur q ≥ 1 (ebenso f¨ ur q = 0) ist also dis[v
1] < dis[v], im
Widerspruch zur Wahl von v.
EADS 2.1 Dijkstra’s Algorithmus 452/455
ľErnst W. Mayr
Beispiel 107 (Dijkstra’s Algorithmus)
gegeben Graph G;
v1 ist der Startknoten;
setzev1 als Bezugsknoten;
setzedis[v1] = 0;
setzedis[Rest] = +∞;
0
∞
∞
∞
∞
∞
∞ 2
6 3
4 3
3 2
1
1 v1
v2
v3
v4
v5
v6
v7
s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
EADS 453/455
ľErnst W. Mayr
Beispiel 107 (Dijkstra’s Algorithmus)
gegeben Graph G;
v1 ist der Startknoten;
setzev1 als Bezugsknoten;
setzedis[v1] = 0;
setzedis[Rest] = +∞;
0
∞
∞
∞
∞
∞
∞ 2
6 3
4 3
3 2
1
1 v1
v2
v3
v4
v5
v6
v7
s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
setzedis[v2] = 2;
markiere(v1, v2);
setzedis[v3] = 6;
markiere(v1, v3);
setzev2 als Bezugsknoten, dadis[v2]minimal;
∞
∞
∞ 0 ∞
2 6
f
3
@
@
@
@
@
@
@
@
@
@
@
@ R 2
6 3
4 3
3 2
1
1 v1
v2
v3
v4
v5
v6
v7 s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
EADS 453/455
ľErnst W. Mayr
Beispiel 107 (Dijkstra’s Algorithmus)
setzedis[v2] = 2;
markiere(v1, v2);
setzedis[v3] = 6;
markiere(v1, v3);
setzev2 als Bezugsknoten, dadis[v2]minimal;
∞
∞
∞ 0 ∞
2 6
f
3
@
@
@
@
@
@
@
@
@
@
@
@ R 2
6 3
4 3
3 2
1
1 v1
v2
v3
v4
v5
v6
v7
s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
setzedis[v3] = 2 + 3 = 5;
markiere(v2, v3);
unmarkiere (v1, v3);
setzedis[v4] = 2 + 4 = 6;
markiere(v2, v4);
setzev3 als Bezugsknoten, dadis[v3]minimal;
∞
∞ 0 ∞
2 5
6 f
@
@
@
@
@
@
@
@
@
@
@
@R
- 2
6 3
4 3
3 2
1
1 v1
v2
v3
v4
v5
v6
v7 s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
EADS 453/455
ľErnst W. Mayr
Beispiel 107 (Dijkstra’s Algorithmus)
setzedis[v3] = 2 + 3 = 5;
markiere(v2, v3);
unmarkiere (v1, v3);
setzedis[v4] = 2 + 4 = 6;
markiere(v2, v4);
setzev3 als Bezugsknoten, dadis[v3]minimal;
∞
∞ 0 ∞
2 5
6 f
@
@
@
@
@
@
@
@
@
@
@
@R
- 2
6 3
4 3
3 2
1
1 v1
v2
v3
v4
v5
v6
v7
s
s s
s s
s s
@
@
@
@
@
@
@
@
@
@
@
@
setzedis[v5] = 5 + 2 = 7;
markiere(v3, v5);
setzedis[v6] = 5 + 3 = 8;
markiere(v3, v6);
setzev4, dannv5 als Bezugsknoten;
0 ∞
2 5
6 7
8 f
@
@
@
@
@
@
@
@
@
@
@
@R
- -
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@ R 2
6 3
4 3
3 2
1
1 v1
v2
v3
v4
v5
v6
v7 s
s s
s s
s s
@
@
@
@
EADS 453/455
ľErnst W. Mayr
Beispiel 107 (Dijkstra’s Algorithmus)
setzedis[v5] = 5 + 2 = 7;
markiere(v3, v5);
setzedis[v6] = 5 + 3 = 8;
markiere(v3, v6);
setzev4, dannv5 als Bezugsknoten;
0 ∞
2 5
6 7
8 f
@
@
@
@
@
@
@
@
@
@
@
@R
- -
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@ R 2
6 3
4 3
3 2
1
1 v1
v2
v3
v4
v5
v6
v7
s
s s
s s
s s
@
@
@
@
setzedis[v7] := 7 + 1 = 8;
markiere(v5, v7);
alle Knoten wurden erreicht:
⇒Algorithmus zu Ende 0
2 5
6 7
8 8 f
@
@
@
@
@
@
@
@
@
@
@
@R
- -
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@ R
@
@
@
@
@
@
@
@
@
@
@
@ R
2 6
3
4 3
3 2
1
1 v1
v2
v3
v4
v5
v6
v7 s
s s
s s
s s
EADS 2.1 Dijkstra’s Algorithmus 453/455
ľErnst W. Mayr
Beobachtung:
ExtractMin liefert eine (schwach) monoton steigende Folge von Schl¨ usseln dis[·];
Die Schl¨ ussel in P Q sind stets ≤ dis[v] + C, wobei v das Ergebnis der vorangehenden ExtractMin-Operation (bzw. s zu Beginn) und C := max
u,v∈A{dis(u, v)} ist.
Satz 108
Dijkstra’s Algorithmus (mit Fibonacci-Heaps) l¨ ost das single-source-shortest-path-Problem in Zeit O(m + n log n).
EADS 2.1 Dijkstra’s Algorithmus 454/455
ľErnst W. Mayr
Bemerkung:
1
Verwendet man Dijkstra’s Algorithmus mit d-Heaps, so erh¨ alt man Laufzeit
O(m log
2+mn
n)
2 Mikkel Thorup:
Undirected single-source shortest paths with positive integer weights in linear time
J. ACM 46(3), pp. 362–394 (1999)
EADS 2.1 Dijkstra’s Algorithmus 455/455
ľErnst W. Mayr