V - Universität Tübingen

Werbung
7. Graphenalgorithmen
Grundlagen:
1. Paar (V, E) heißt gerichteter Graph G, wobei
V endl. Menge von Knoten und E ⊆ V × V
eine endl. Menge von Kanten ist.
2
Element e = (v,w) ∈ E
1
3
heißt Kante von v nach w
(„ v
w “)
v ist Startknoten von e
5
w ist Zielknoten von e
w ist Nachbarknoten von v (w ist adjazent zu v)
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
4
1
2. Pfad in G ist Folge (v0, ..., vk) von Knoten mit k ≥ 0
und (vi, vi+1) ∈ E für 0 ≤ i ≤ k − 1.
Länge des Pfades ist k.
Falls v0 = vk und k ≥ 1, so heißt der Pfad Kreis bzw. Zyklus.
Falls vi ≠ v j für alle i ≠ j , so heißt der Pfad einfach.
Falls es Pfad von v nach w in G gibt, so schreibt man
*
v
→
w.
G
Gerichteter Graph heißt zyklisch, falls er Kreis enthält;
sonst azyklisch.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
2
7.1 Darstellung von Graphen
Annahme: V = {1, 2, ..., n}, G = (V, E), n = |V|.
Zwei Darstellungsarten sind üblich:
1. Darstellung: Adjazenzmatrix A = (aij ) , 1 ≤ i,j ≤ n
1 ,
aij := 
0 ,
Bsp.:
falls (i,j ) ∈ E
sonst.
1 2 3 4 5
1
4
2
5
3
Vorlesung Algorithmen (RN/MK/AZ)
1
2
3
4
5
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
WSI für Informatik, Universität Tübingen
1
1
0
0
0
3
Bei ungerichteten Graphen ist die Adjazenzmatrix
symmetrisch:
1
4
2
5
3
1 2 3 4 5
1
2
3
4
5
Vorlesung Algorithmen (RN/MK/AZ)
falls {i,j}∈ E
sonst.
1 ,
hier: aij := 
0 ,
0
1
0
0
1
1
0
0
0
1
0
0
0
0
1
0
0
0
0
0
1
1
1
0
0
WSI für Informatik, Universität Tübingen
4
Platzbedarf: O(n2)
ist günstig, falls m := E ≈ n 2 .
Aber: Oft sind Graphen dünn, d.h. m ≈ O (n ) .
Bsp.:
Zahl der Kanten in Bäumen mit n Knoten ist n – 1.
Planare Graphen: Graph heißt planar, falls er in Ebene
gezeichnet werden kann, ohne dass sich Kanten
überkreuzen.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
5
Zwei nicht-planare, ungerichtete Graphen:
K3,3
K5
(„vollständiger“ bipartiter
Graph mit 3 und 3 Knoten)
Mitteilung: Ein planarer Graph mit n>2 Knoten enthält
maximal 3n – 6 Kanten.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
6
2. Darstellung: Adjanzenzlisten
Speichere für jeden Knoten v seine „Nachbarn“:
G = (V, E) gerichtet:
InAdj(v ) = { w ∈ V
(w, v ) ∈ E}
OutAdj(v ) = { w ∈ V (v, w) ∈ E}
G ungerichtet:
Adj(v ) = { w ∈ V
Vorlesung Algorithmen (RN/MK/AZ)
{v,w}∈ E}
WSI für Informatik, Universität Tübingen
7
Im vorigen Beispiel (gerichtet):
InAdj: 1
2
3
4
5
2
OutAdj:
5
1
2
1
2
3
4
5
5
1
5
3
Platzbedarf: O(n + m)
Nachteil: Zugriffszeit auf Kante abhängig von Listenlänge,
d.h. Knotengrad:
Eingangsgrad indeg(v) eines Knoten v = { (w, v ) (w, v ) ∈ E} ,
Ausgangsgrad outdeg(v) eines Knoten v = { (v, w) (v, w) ∈ E}
(analog für ungerichtete Graphen).
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
8
Graph G = (V, E) heißt Baum, falls
a) V enthält genau einen Knoten v0 mit indeg(v0) = 0.
b) ∀ v ∈ V \ {v0 }: indeg (v ) = 1
c) G ist azyklisch.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
9
7.2 Topologisches Sortieren
Sei G = (V, E) gerichteter Graph.
Abbildung num: V
{1, ..., n} mit n = |V| heißt
topologische Sortierung von G, falls num(v) < num(w)
für alle (v, w) ∈ E .
Bsp.:
1
4
2
5
3
2
num: 1
1
2
1
2
Vorlesung Algorithmen (RN/MK/AZ)
5
3
3
4
4
5
3 es gibt keine
topologische
Sortierung!
WSI für Informatik, Universität Tübingen
10
Lemma:
Gerichteter Graph G = (V, E) besitzt genau dann
eine topologische Sortierung, wenn G azyklisch ist.
Beweis:
"⇒" :
Sei G zyklisch. Dann ist etwa (v0, ..., vk), k ≥ 1,
ein Kreis. Für eine topologische Sortierung muss
aber gelten:
num(v0) < num(v1) < ... < num(vk) = num(v0).
Widerspruch!!
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
11
"⇐" :
Sei G azyklisch.
Beh.: G enthält Knoten v mit indeg(v) = 0.
Wir finden solchen Knoten v wie folgt.
Starte mit bel. Knoten w und gehe entlang eingehender
Kanten „rückwärts“. Da Graph azyklisch und endlich,
wird kein Knoten auf diesem „Rückweg“ zweimal besucht
und daher terminiert dieser Prozess mit einem Knoten v
mit indeg(v) = 0.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
12
Jetzt zur topologischen Sortierung:
Beweis per Induktion über Knotenzahl:
|V| = 1: trivial.
|V| > 1: Wähle (gemäß Beh.) v mit indeg(v) = 0.
Entferne v und sortiere den Restgraph G´ topologisch
induktiv, d.h.:
Sei num´ : V´
{1, ..., |V´|} top. Sortierung für G´.
Dann ergibt sich die top. Sort. num durch
num´(w) + 1,
num(w) = 
1,

Vorlesung Algorithmen (RN/MK/AZ)
falls w ≠ v
falls w = v.
WSI für Informatik, Universität Tübingen
13
Grundalgorithmus für topologisches Sortieren:
count
0;
while ∃ v ∈ V mit indeg(v) = 0 do
count ++;
num(v)
count;
streiche v und alle von v ausgehenden Kanten aus G;
od
if count < |V|
then ausgabe(G zyklisch!)
fi
Komplexitätsanalyse:
Problem: Test auf Existenz eines Knotens v mit indeg(v) = 0.
Lösung: Merke alle Knoten mit indeg = 0 in Menge ZERO.
Führe für jeden Knoten Buch über Anzahl jeweils
einmündender Kanten.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
14
Algorithmus TOPSORT:
(1) ZERO
Ø;
(2) for all v ∈ V do INDEG[v]
0 od;
(3) for all e ∈ E do INDEG[target(e)] ++ od;
(4) for all v ∈ V do
(5)
if INDEG[v] = 0 then ZERO
ZERO ∪ {v} fi
(6) od
(7) count
Fortsetzung
0;
nächste Folie
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
15
(8) while ZERO ≠ Ø do
(9)
wähle und streiche v ∈ ZERO ;
(10)
count ++;
(11)
num[v]
(12)
count;
for all (v, w) ∈ E do
(13)
INDEG[w] – – ;
(14)
if INDEG[w] = 0 then ZERO
(15)
ZERO ∪ {w} fi
od
(16) od;
(17) if count < |V| then ausgabe(G zyklisch!) fi
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
16
Satz:
Topologische Sortierung eines gerichteten
Graphen G = (V, E) kann in Zeit O(n + m)
(Linearzeit!) berechnet werden.
Hierbei: n = |V|, m = |E|.
Beweis: Die Korrektheit folgt unmittelbar mit dem Lemma.
Zur Komplexität: Übungsaufgabe!
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
17
7.3 Kürzeste/Billigste Wege in Graphen
Sei G = (V, E) gerichteter Graph mit Kostenfunktion
c: E
R, ein sogenanntes Netzwerk.
Sei p = (v0, ..., vk) Pfad von v0 = v nach vk = w.
Dann heißt k −1
c( p ) := ∑ c(vi , vi +1 )
i =0
Kosten des Pfades von v nach w.
dist(v, w) = inf {c(p) | p ist Pfad von v nach w}
heißt Entfernung.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
18
Beispiel:
2
–1
4
1
2
3
3
4
dist(1,2) = – 1
dist(3,1) = ∞
dist(3,4) = – ∞ , da
Pfad (3,4,(5,6,4)i) Kosten 3 – i
hat für alle i ≥ 0.
negativer Zyklus
2
6
–6
5
3
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
19
3 grundsätzliche Problemstellungen:
1 single pair shortest paths
(kürzeste Wege zwischen einem Knotenpaar)
2 single source shortest paths
(kürzeste Wege von einem Knoten aus)
3 all pairs shortest paths
(kürzeste Wege zwischen allen Knotenpaaren)
Bemerkung:
Unbekannt, ob 1 leichter/effizienter lösbar als 2 .
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
20
7.3.1 Single Source Shortest Paths
Sei s der „Quellknoten“. G = (V, E).
Gesucht für alle u ∈ V
∞, falls kein Pfad von s nach u in G,
δ (u ) := 
dist (s, u ), sonst.
Lemma:
Sei u ∈ V . Dann gilt:
i) δ (u ) = −∞ gdw. u ist erreichbar aus negativem
Zyklus, der von s aus erreichbar ist.
ii) δ (u ) ∈ R ⇒ ∃ billigster einfacher Pfad von
s nach u mit Kosten δ (u ) .
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
21
Beweis:
i) "⇐" : klar!
"⇒" : Sei c := ∑ c(e ) und sei p ein kürzester Weg von
e∈E
s nach u mit c(p) < – c.
Dann muss p Zyklus q enthalten, d.h. p ist nicht
einfach. Wäre nun c(q ) ≥ 0, so könnten wir
q aus p entfernen und so p verkürzen/verbilligen.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
22
ii) Falls δ (u )∈ R , so gibt es Pfad von s nach u.
Wir zeigen: δ (u ) = min{ c( p )
p ist Pfad von s nach u
und p ist einfach }.
Sei p* billigster einfacher Weg von s nach u.
Ist Behauptung falsch, dann gibt es einen nichteinfachen
Weg q von s nach u mit c(q) < c(p*).
Durch Entfernen des Zyklus aus q entsteht kürzerer
Weg q´ und da Zyklus (gemäß i) ) nicht negativ ist, folgt
c(q´) ≤ c(q) < c(p*), ein Widerspruch.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
23
7.3.1.1 Der geg. Graph G = (V, E) ist azyklisch.
Bsp.:
2
2
3
5
2
5
s
–1
3
2
6
4
1
δ (s ) = 0,
δ (2 ) = 2,
δ (3) = −1,
δ (4 ) = inf {7,1} = 1,
δ (5) = 2 + 3 = 5,
δ (6) = inf {5 + 2, 7 + 1, 1 + 1} = 2
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
24
Nachfolgender Algorithmus setzt voraus, dass Graph
topologisch sortiert ist, „also“ V = {1, 2, ... , n}.
Algorithmus:
d(s)
0;
Pfad(s) s;
(* Pfad als Liste repräsentiert *)
for all v ∈ V \ {s} do d(v)
∞ od;
for v = s + 1 to n do
d(v) min {d(u) + c(u,v) | (u,v) ∈ E}
(* u* sei hierbei ein optimaler u-Wert *)
Pfad(v) Pfad(u*) ° v
od
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
25
Satz:
Nach Ausführung von obigem Algorithmus gilt
∀v ∈ V
1) d (v ) = δ (v )
2) d (v ) < ∞ ⇒ Pfad(v) ist billigster Weg
von s nach v.
3) Algorithmus hat Laufzeit O( n + m), wobei
n = |V| und m = |E|.
Beweis:
Korrektheit ( 1) + 2) ): Induktion über v
v < s: δ (v ) = ∞, da v von s aus nicht erreichbar.
d (v ) = ∞, da nach Init. nicht mehr verändert
v = s: δ (v ) = d (v ) = 0. Pfad(s) = s ist einziger Weg.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
26
v > s: Sei In (v ) := { u ∈ V (u , v ) ∈ E }.
Nach Ind´vor. gilt für u ∈ In (v ) schon
d (u ) = δ (u ) und Pfad(u) ist berechnet.
Ist In (v ) = Ø, dann d (v ) = δ (v ) = ∞.
Ist In (v ) ≠ Ø, so wähle u* mit
d (u *) + c(u*, v ) minimal.
Falls d(u*) = ∞ , so auch d (v ) = δ (v ) = ∞.
Sonst ergibt sich billigster Weg nach v
durch Konkatenation und
δ (v ) = δ (u *) + c(u*, v ) = d (v ).
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
27
Laufzeit:
Topologisches Sortieren kostet Zeit O( n + m ).
Initialisierung: O(n)
„Hauptteil“: Komplexität wird i.w. bestimmt durch
∑ In(v )
= m,
v∈V
also O( n + m ).
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
28
7.3.1.2 Alle Kantenkosten nichtnegativ (d.h. ∀e ∈ E , c(e) ≥ 0),
Zyklen erlaubt
Dijkstras Algorithmus:
Nachfolgend nur Kosten kürzester Pfad berechnet;
eigentliche Pfadberechnung analog vorher.
Idee:
Für Menge S von Knoten mit bereits bestimmtem kürzesten
Pfad muss es Knoten x ∈ V \ S geben, sodass kürzester Weg
von s nach x über die Knoten in S geht und dann noch eine
Kante aus S nach x.
Genauer: x ist Knoten, der für alle u ∈ S den Ausdruck
δ (u ) + c (u , x ) minimiert.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
29
Nachfolgend:
S := Menge der Knoten u mit bekanntem δ(u ).
S ′ := Menge der Knoten aus V \ S , die Nachbarn in S haben
Algorithmus:
S ← {s}; d (s ) ← 0;
S ′ ← OutAdj(s );
for all u ∈ S ′ do;
d ′(u ) ← c(s, u );
for all u ∈ V − (S ∪ S ′) do
d ′(u ) ← ∞;
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
30
while S ′ ≠ o/ do
x ← derjenige Knoten aus S ′ mit minimalem d ′ - Wert;
d ( x ) ← d ′( x );
S ← S ∪ {x};
S ′ ← S ′ \ {x};
for all u ∈ OutAdj ( x ) do
if u ∉ S
then S ′ ← S ′ ∪ {u };
d ′(u ) ← min {d ′(u ), d ( x ) + c ( x , u )}
fi
od
od
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
31
Beispiel (Dijkstra, Ungerichteter Graph):
S = {s, D, C},
S´={E, B, A}
d(C) = 2,
d´(B) = 5,
d´(E) = 3,
d´(A) = 3
S = {s},
S´={C, D, E} 3
1
A
B 4
d(s) = 0,
d´(C) = 2,
1
4
d´(D) = 1,
3
D 1
2 C
d´(E) = 5
1
2
2
S = {s, D, C, A},
S = {s, D},
S´={E, B}
0 s
3
E
5
S´={C, E, B}
d(A) = 3
d(D) = 1,
d´(B) = 4,
S = {s, D, C, A, E},
d´(C) = 2,
d´(E) = 3
S´={B}
d´(E) = 3,
d(E) = 3
S = {s, D, C, A, E, B},
d´(B) = 5
d´(B) = 4,
d(B) = 4,
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
32
Beispiel (Dijkstra, Gerichteter Graph):
1 1
10
1
5
4
4
4
B
6
0 s 1
H
1
F
3 7 7
2
2 2 C
5
2
3
3
3 6 3 G
5 5
2 A
J
1
E 1 1
2
3
2
I
1
10
7
D
4
K
8
8
5 5
9
10
2 L ∞
10 9 9
12 11 11
9
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
33
Lemma:
Sei x ∈ S ′ so gewählt, dass d ′( x ) minimal ist.
Dann gilt d′(x) = δ (x).
Beweis:
Sei p ein billigster Weg von s nach x derart, dass alle
Knoten (bis auf x) in S liegen.
Angenommen, es gäbe einen billigeren Weg q von s nach x.
q muss einen ersten Knoten v in V \ S haben und nach Wahl
von x ist d ′(v ) ≥ d ′( x ).
Da alle Kanten nichtnegativ sind, gilt aber
c(q ) ≥ d ′(v ) ≥ d ′( x ) = d ( x ) = c( p ),
ein Widerspruch.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
34
Zur Laufzeit:
Implementiere S und S ′ als Bitvektoren
und d und d ′ als Arrays.
•Aufwand für „ for all u ∈ OutAdj( x ) “:
∑ OutAdj( x ) = O(m + n ).
x∈V
•n-maliges Minimieren über S ′ : O(n ² ).
Insgesamt ergibt sich Laufzeit O(n²+m),
für dichte Graphen (m ≈ n ² ) ausreichend.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
35
Alternativ:
Speichere S ′ in Heap (balancierter Baum), gemäß
d ′-Werten geordnet.
Damit Laufzeit O((m+n)log n),da nun Einfügen
und Löschen in S ′ je O(log n ) Zeit kostet.
Für dünne Graphen ist dies eine Verbesserung.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
36
Satz:
Mit Hilfe des Algorithmus von Dijkstra läßt sich das
Single Source Shortest Path Problem in Laufzeiten
O(n ² ) bzw. O((m + n ) log n ) lösen.
Mitteilung:
Mit Hilfe sogenannter Fibonacci-Heaps läßt sich die
Laufzeit des Algorithmus von Dijkstra asymptotisch
zu O(n log n + m) verbessern.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
37
7.3.1.3 Negative Kantenkosten erlaubt, aber
keine negativen Zyklen.
Bellman-Ford-Algorithmus
Das „Entspannen einer Kante (v,w)“ bezeichnen wir mit
Relax ((v,w)):
d (w) ← min{d (w), d (v ) + c(v, w)}
Offensichtlich: Entspannen einer Kante erhöht keinen d-Wert
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
38
Lemma:
Falls für alle u ∈ V vor dem Entspannen einer beliebigen
Kante (v,w) gilt, dass d(u) ≥δ (u) , dann gilt dies auch
hinterher.
Beweis:
Jeder Weg von s nach v zusammen mit Kante (v,w)
ergibt Weg von s nach w.
Deshalb δ (v ) + c (v, w ) ≥ δ (w ).
Weiterhin: δ (v) + c(v,w) ≤ d (v) + c(v,w)
⇒ δ (w) ≤ d (v) + c(v, w)
⇒ δ (w) ≤ d (w) falls (v,w) „echt“ relaxiert.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
39
Algorithmus:
d (s ) ← 0;
for all v ≠ s do
d (v ) ← ∞
while „ möglich“ do
Entspanne Kanten
od
Beobachtung: d(u) wird immer kleiner, unterschreitet aber nie δ(u) .
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
40
Offen bleibt noch die Frage nach der „Entspannungs-Reihenfolge“,
sodass d schnell gegen δ konvergiert.
Lemma:
Sei w∈ V und sei δ (w) < ∞ und sei (v, w) die letzte Kante
auf dem billigsten Weg von s nach w.
Dann gilt:
Falls (v,w) entspannt wird, nachdem d(v) = δ(v) geworden
ist, so ist danach d(w) = δ(w).
Beweis: Übung!
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
41
Algorithmus:
d (s ) ← 0;
for all v ≠ s do
d (v ) ← ∞;
for i ← 1 to n − 1 do
for all (v, w) ∈ E do
Relax ((v, w));
Bem.: im Beispiel spielt
die Reihenfolge der Kanten
in der for all-Schleife eine
Rolle, die Aussagen gelten
aber für alle Reihenfolgen
Lemma:
Für i=0,..., n-1 gilt:
Nach dem i-ten Durchlauf der for-Schleife ist d (w) = δ(w)
für alle w ∈ V , für die es einen billigsten Pfad der Länge i
von s nach w gibt.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
42
Beweis:
Induktion über i:
i = 0 : d (s ) = δ(s ), da es keine negativen Zykel gibt.
i → i +1:
Sei w der Knoten mit billigstem Weg von s nach w der
Länge i+1 und sei (v,w) die letzte Kante auf diesem Weg.
Also gibt es billigsten Weg von s nach v der Länge i und
nach Induktionsannahme ist nach dem i-ten Durchlauf
der for-Schleife d (v ) = δ(v ) . Im (i+1)-ten Durchlauf wird
insbesondere (v,w) entspannt:
⇒ d (w) = d (v ) + c((v, w))
= δ(v ) + c((v, w))
= δ( w )
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
43
Korollar:
Nach dem (n-1)-ten Schleifendurchlauf gilt für alle v aus V,
dass d (v ) = δ(v ).
Beweis:
Nach obigem Lemma und der Annahme der Nichtexistenz
negativer Zyklen folgt, dass alle billigsten Wege Länge
höchstens n-1 haben.
Insgesamt:
Satz:
In Laufzeit O(n ⋅ m ) läßt sich das Single Source Shortest Path
Problem lösen, falls der Graph keine negativen Zyklen enthält.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
44
Beispiel (Bellmann-Ford, Gerichteter Graph, positive Kanten):
1
B
10
5 4
6
0 s 1
H
1
F
3 7
2
2 C
5 2 L ∞
2
3
3
3 6 3 G
5 5
2 A
J
1
E 1 1
10 9
2
3
I
1
10
7
D
4
K 12 11
8
5
9
1
4
i = 1, i = 2, i = 3, i = 4, i = 5,
Vorlesung Algorithmen (RN/MK/AZ)
i = 6, i = 7, i = 8,
WSI für Informatik, Universität Tübingen
45
Beispiel (Bellmann-Ford, Gerichteter Graph, negative Kanten,
aber keine negativen Zyklen):
1
7
1
5
1
4
B
6
0 s 1
H
1
F
3 4
2
-1 C
-5 2 L ∞
2
-3
-3
3 6 3 G
5 -5
2 A
J
1
E -1 1
1
2
3
I
1
7
7
D
4
K 3
5
5 4
4
i = 1, i = 2, i = 3, i = 4, i = 5,
Vorlesung Algorithmen (RN/MK/AZ)
i = 6, i = 7, i = 8,
WSI für Informatik, Universität Tübingen
46
Beispiel (Bellmann-Ford, Ungerichteter Graph, positive Kanten):
0
1
1
A
2
s
4
B
4 3
6 5
6
2
5
C
1
D
6
12 11 10
E
4
9 7 6
i = 1, i = 2, i = 3, i = 4, i = 5,
Warum braucht der Algorithmus hier n-1 Iterationen
bis zur Konvergenz?
Welches wäre der einfachste Graph mit dieser Eigenschaft?
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
47
7.3.1.4: Auch negative Zyklen erlaubt.
Algorithmus:
1 Führe zuerst die n-1 for-Schleifendurchläufe des Algorithmus von Bellman-Ford aus und merke in d1 die so
erzielten d-Werte.
2 Führe n weitere for-Schleifendurchläufe aus und speichere
das Ergebnis in d2.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
48
Lemma:
Für w ∈ V gilt :
i) d 2 (w) = d1 (w) ⇒ δ(w ) = d1 (w)
ii) d 2 (w) < d1 (w) ⇒ δ(w ) = −∞
Beweis: Übung!
Bemerkung:
Wenn sich nach nur einem weiteren Durchlauf der
for-Schleife nach Abschluss von 1 noch etwas ändert, so
gibt es einen negativen Zyklus, sonst aber nicht.
Um aber alle Zyklen entdecken zu können, benötigt man
in 2 insgesamt n Durchläufe.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
49
7.3.2 All Pairs Shortest Paths (Floyd-Warshall)
Annahme: Keine negativen Zyklen.
V = {1,2,..., n}
Für i, j ∈ V und 0 ≤ k ≤ n definiere
δ k (i, j ) := Kosten des billigsten Weges von i nach j ,
dessen innere Knoten ≤ k sind.
Beispiel:
δ 0 (1,4 ) = ∞
δ1 (1,4 ) = ∞
δ 2 (1,4 ) = 6
δ 3 (1,4 ) = 1
4
2
2
2
1
-3
3
4
5
δ 4 (1,4 ) = 1
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
50
Also:
c(i, j ), falls (i, j ) ∈ E.

δ 0 (i, j ) =  0
, falls i = j.
 ∞ , sonst.

δ n (i, j ) = δ(i, j ) = Kosten des billigsten Weges von i nach j.
Frage: Wie berechnet sich δ k aus δ k-1 ?
Entweder k Teil eines billigeren
Weges oder nicht:
2 Möglichkeiten:
δ k-1 (i, j )
i
δ k-1 (i, k )
k
j
δ k-1 (k , j )
Also gilt: δ k (i, j ) = min{δ k −1 (i, j ), δ k −1 (i, k ) + δ k −1 (k , j )}
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
51
Algorithmus (Floyd-Warshall):
for all i , j ∈ V do
c (i , j ), falls (i , j ) ∈ E

δ 0 (i , j ) ←  0
, falls i = j
∞
, sonst
;

od
for k = 1 to n do
for i = 1 to n do
for j = 1 to n do
δ k (i , j ) ← min { δ k −1 (i , j ), δ k −1 (i , k ) + δ k −1 (k , j )}
od
od
od
Laufzeit: O(n³)
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
52
Beispiel (Floyd-Warshall, Ungerichteter Graph, positive Kanten):
1
2
2
1
4
3
D1 = D0
0137uu
1026uu
D2 = 3 2 0 2 5 u
762016
uu5104
uuu640
6
4
1
2
5
5
6
6
4
01358u
10247u
D3 = 3 2 0 2 5 u
542016
875104
uuu640
Vorlesung Algorithmen (RN/MK/AZ)
D0 =
014uuu
1026uu
42025u
u62016
uu5104
uuu640
0 1 3 5 6 11
1 0 2 4 5 10
D4= 3 2 0 2 3 8 u.s.w.
542016
653104
1110 8 6 4 0
WSI für Informatik, Universität Tübingen
53
Alternativer Algorithmus:
Benutze Algorithmus von Dijkstra bzw. Bellman-Ford
Idee:
Führe n-mal für alle möglichen Startknoten Bellman-FordAlgorithmus aus.
Laufzeit : O(n ⋅ nm )
Beobachtung:
Es reicht sogar, einmal Bellman-Ford und (n-1)-mal
Dijkstra auszuführen.
Laufzeit : O(n ⋅ (n + m ) log n )
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
54
7.3.3 All Pairs Shortest Paths (Matrixmultiplikation)
Annahme: Keine negativen Zyklen.
G = (V , E ), V = {1,2,..., n}
Wir wissen (Lemma): Wenn ein Pfad von i über k nach j der
kürzeste Pfad von i nach j ist, dann sind auch die Pfade von
i nach k und von k nach j jeweils kürzeste Pfade.
Sei G als Adjazenzmatrix W = (wij) repräsentiert.
Sei p ein kürzester Pfad von i nach j mit m Kanten.
Es gilt: m < n.
Falls i = j, dann hat p die Länge 0 und keine Kanten.
Falls i ≠ j, dann zerlegen wir p in Pfad p´ von i nach k und
Kante (k, j), wobei p´ dann m-1 Kanten hat. Es gilt:
δ (i, j ) = δ (i, k ) + wkj
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
55
Sei lij(m ) der kürzeste Pfad zwischen Knoten i und j, der
höchstens m Kanten hat. Für m = 0 gilt
 0 falls i = j
(0)
lij = 
sonst
∞
Für m ≥ 1 berechnen wir
(
{
+w }
lij( m ) = min lij( m −1) , min1≤ k ≤ n lik( m −1) + wkj
{
= min1≤ k ≤ n lik( m −1)
kj
})
denn wjj = 0 für alle j
Da ein kürzester Weg von i nach j höchstens n-1 Kanten hat,
gilt
δ (i, j ) = lij( n −1) = lij( n ) = lij( n +1) = ...
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
56
Wir berechnen also die lij(m )in einer Folge von Matrizen
L(1), L(2), ... L(n-1), mit L(m) = ( lij(m )).
Algorithmus Slow-All-Pairs-Shortest-Paths (W)
(1) := W
1) L(old)
:= W
4)
Zeitaufwand:
O(n
2) for m := 2 to n-1 do begin
3) for i := 1 to n do
4)
for j := 1 to n do begin
Verwendung von
(m
(new
) )
5)
lij :=:=∞∞
nur zwei Matrizen
L(new) und L(old)
6)
for k := 1 to n do
m) )
) ) ( m −( 1old
7)
llij(ij(new
:=min(
min(llij(ijm( new
:=
, lik, lik ) +) +ww
kj )
kj )
8)
end
9)
L(old) := L(new)
10) end
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
57
Beispiel:
4
2
2
1
-3
 0 4 − 3 ∞
∞ 0 ∞ 2 

L(1) = 
∞ 2 0 5 


∞ ∞ ∞ 0 
 0 − 1 − 3 1
∞ 0 ∞ 2 

L(3) = 
∞ 2
0 4


∞
∞
∞
0


Vorlesung Algorithmen (RN/MK/AZ)
2
L( 2 )
3
4
5
 0 −1 − 3
∞ 0 ∞
=
∞ 2
0

∞ ∞ ∞
WSI für Informatik, Universität Tübingen
2
2
4

0
58
Beispiel (Matrixmultiplikationsalgorithmus):
2
1
2
1
4
0 1 3
1 0 2
L2 = 3 2 0
6 4 2
9 7 3
u 12 8
3
6
4
2
0
1
5
9 u
7 12
3 8
1 5
0 4
4 0
6
2
5
4
1
5
6
6
4
0 1 3
1 0 2
L3 = 3 2 0
5 4 2
7 5 3
1210 7
Vorlesung Algorithmen (RN/MK/AZ)
0
1
L1=W= 4
u
u
u
5
4
2
0
1
5
7 12
5 10
3 7
1 5
0 4
4 0
1
0
2
6
u
u
4
2
0
2
5
u
u
6
2
0
1
6
u
u
5
1
0
4
0 1
1 0
L4 = 3 2
5 4
6 5
11 9
5
L : 10
3
2
0
2
3
7
5
4
2
0
1
5
6 11 10
5 9
3 7
1 5
0 4
4 0
WSI für Informatik, Universität Tübingen
u
u
u
6
4
0
59
Geht es auch schneller? Ja, durch Quadrierung!
Bisher hatten wir berechnet:
=W
L(1) = L(0) * W
L(2) = L(1) * W
= W2
L(3) = L(2) * W
= W3
...
L(n-1) = L(n-2) * W = Wn-1
Jetzt berechnen wir schneller:
=W
L(1) =
L(2) = W * W
= W2
L(4) = W2 * W2
= W4
L(8) = W4 * W4
= W8
...
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
60
Algorithmus Fast-All-Pairs-Shortest-Paths (W)
1) L(old) := W
2) m := 1
3 log n),
Zeitaufwand:
O(n
3) while m < n-1 do
das ist aber immer noch
4) for i := 1 to n do
langsamer als der
5)
for j := 1 to n do begin
Floyd-Warshall-Algorithm.
(new )
6)
lij := ∞
7)
for k := 1 to n do
8)
lij( new) := min(lij( new) , lik( old ) + lkj( old ) )
9)
end
10) m := 2m
11) L(old) := L(new)
12) endwhile
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
61
7.4 Depth First Search (Tiefensuche)
Durchmusterung von Graphen.
Wichtige Eigenschaften:
Mit DFS Graph systematisch von einem Knoten s aus zu
durchmustern, dabei immer zuerst „in die Tiefe“.
Beispiel:
s
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
62
Rekursion:
procedure DFS (s)
besucht [s]
true;
drucke (s);
for all (s, v ) ∈ E do
if not besucht [v]
then DFS(v)
fi;
od
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
63
DFS teilt die Kanten des Graphen in vier Klassen ein, je nach
Art des Besuchs:
Wir betrachten gerade die gerichtete Kante (v,w):
1. (v,w) gehört zu Baumkanten T, falls w noch nicht besucht.
2. (v,w) gehört zu Vorwärtskanten F, falls w schon besucht
*T w “, d.h. ∃ Pfad von v nach w bestehend aus
und „ v 
→
lauter Baumkanten.
3. (v,w) gehört zu Rückwärtskanten B, falls w schon besucht
*T v.
→
und w 
4. (v,w) gehört zu Querkanten C, falls w schon besucht, aber
*T v.
*T w noch w 
→
weder v 
→
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
64
Erweiterung um dfsnum(v) und compnum(v):
• dfsnum(v): Reihenfolge der rekursiven DFS-Aufrufe.
• compnum(v): Abschlussreihenfolge der DFS-Aufrufe.
Hauptprogramm:
for all v ∈ V do besucht[v]
false od;
z1
z2
0;
T ← B ← F ← C ← o/ ;
for all v ∈ V do
if not besucht[v] then DFS(v) fi
od
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
65
Für die Implementierung brauchen wir 2 Zähler z1, z2:
(1) procedure DFS(v)
(2)
besucht[v]
true; z1
z1+1
(3)
dfsnum[v]
z1;
(4)
for all (v, w) ∈ E do
(5)
if not besucht[w] then T ← T ∪ {(v, w)}
(6)
DFS(w)
*T w then F ← F ∪ {(v, w)}
(7)
else if v 
→
*T v then B ← B ∪ {(v, w)}
→
(8)
else if w 
(9)
else C ← C ∪ {(v, w)}
(10)
fi
(11)
fi
(12)
fi
(13) od
(14) z 2 ← z 2 + 1;
(15) compnum[v]
z2
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
66
Beispiel:
i 9 9
b 2 1
dfsnum[v]
s
d 4 2
f 6 3
a 1 8
c 3 6
e 5 5
compnum[v]
g 7 4
h 8 7
Laufzeit:
da
O(n+m)
a) Einzellaufzeit eines Aufrufs (ohne Rekursion)
ist O(1+outdeg(v))
b) für jeden Knoten einmal DFS-Aufruf
⇒ O ∑ (1 + out deg(v )) = O(n + m ).

 v∈V
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
67
Beispiel (Klassifikation der Kanten durch DFS):
12 11
B
1 12
s
3 9 C
A
2 10
10 8
F
11 7
H
6 3
G
J
E
D
4 6
Vorlesung Algorithmen (RN/MK/AZ)
5 5
L 13 13
I
9 4
7 2
K
8 1
WSI für Informatik, Universität Tübingen
68
Beispiel (Klassifikation der Kanten durch DFS):
12 11
B
1 12
s
3 9 C
A
2 10
10 8
F
11 7
H
6 3
G
J
E
D
4 6
Vorlesung Algorithmen (RN/MK/AZ)
5 5
L 13 13
I
9 4
7 2
K
8 1
WSI für Informatik, Universität Tübingen
69
Lemma (Eigenschaften, Teil 1):
a) Kantenklassen T,B,F,C bilden Partition der Kantenmenge E
b) T entspricht dem Wald der rekursiven Aufrufe
*T w gdw. dfsnum[v ] ≤ dfsnum[w] und
c) v 
→
compnum[w] ≤ compnum[v ].
* z) ,
*T w, (w, z ) ∈ E und ¬ (v 
d) Seien v, w, z ∈ V mit v 
→
→
T
dann
v
*
w
i) dfsnum[z ] < dfsnum[v ]
ii) (w, z ) ∈ B ∪ C
?
z
iii) compnum[z ] > compnum[v ] gdw. (w, z ) ∈ B.
iv) compnum[z ] < compnum[v ] gdw. (w,z ) ∈ C.
z
*
v
Vorlesung Algorithmen (RN/MK/AZ)
*
w
*
v
z
WSI für Informatik, Universität Tübingen
*
w
70
Beweis: a), b) klar: direkt aus Algorithmus.
*T w ⇔ Aufruf DFS(w) geschachtelt in DFS(v)
→
c) v 
⇔ dfsnum[v ] ≤ dfsnum[w] und
compnum[v ] ≥ compnum[w].
d)
*T w ⇒ dfsnum[v ] ≤ dfsnum[w]
v
→
(w, z ) ∈ E ⇒ DFS( z ) wird aufgerufen, bevor DFS(w)
endet, und auch bevor DFS(v) endet.
*T z ) ⇔ DFS( z ) nicht in DFS(v) geschachtelt
¬(v 
→
⇒ DFS( z ) startet vor Aufruf DFS(v ).
⇒ dfsnum[z ] < dfsnum[v ]
(i)
e) ( Teil 2 )
→ (w, z ) ∈ B ∪ C
(ii)
*T w nach Definition von B
(w, z ) ∈ B ⇔ z →
* v da v 
*T w und ¬(v 
*T z )
→
→
⇔z
→
T
⇔ compnum[z ] > compnum[v ]
(iii)
(ii), (iii)
(iv)
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
71
Lemma (Eigenschaften, Teil 2):
Sei (v, w) ∈ E :
e) (v, w) ∈ T ∪ F ⇔ dfsnum[v ] ≤ dfsnum[w].
f) (v, w) ∈ B ⇔ dfsnum[w] < dfsnum[v ] und
compnum[w] > compnum[v ].
g) (v, w) ∈ C ⇔ dfsnum[w] < dfsnum[v ] und
compnum[w] < compnum[v ].
e)
f)
v
w
*
v
*
w
Vorlesung Algorithmen (RN/MK/AZ)
*
w
g)
*
*
v
*
w
w vor v
besucht
WSI für Informatik, Universität Tübingen
v
72
Beweis:
e)
*T w ⇒ dfsnum[v ] ≤ dfsnum[w]
(v, w) ∈ T ∪ F ⇒ v →
Sei dfsnum [v ] ≤ dfsnum [w].
Da (v, w ) ∈ E , muss DFS(w ) vor Abschluss
von DFS(v ) aufgerufen werden.
⇒ echte Schachtelu ng
*T w
v
→
⇒ (v, w ) ∈ T ∪ F
f), g)
folgen aus d) und e) ...
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
73
Bemerkungen:
•T, B, F, C werden im wesentlichen durch dfsnum, compnum
festgelegt (vgl. Lemma!)
•In azyklischen Graphen gibt es keine Rückwärtskanten, d.h.
∀(v, w) ∈ E : compnum[v ] > compnum[w]
⇒ Nummerierung num(v ) := n + 1 − compnum[v ]
ergibt topologische Sortierung.
Mitteilung:
Zusammenhangskomponenten in ungerichteten Graphen
können mit Hilfe von DFS in Zeit O(n+m) berechnet werden.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
74
Starke Zusammenhangskomponenten
Ein gerichteter Graph G=(V,E) heißt stark zusammen* w.
→
hängend gdw. ∀v, w ∈ V : v 
E
Die maximalen (bzgl. Mengeninklusion) stark zusammenhängenden Teilgraphen von G heißen starke Zusammenhangskomponenten (SZK‘s).
Beispiel:
a
c
b
K1
K3
d
h K4
e
K2
Vorlesung Algorithmen (RN/MK/AZ)
f
g
WSI für Informatik, Universität Tübingen
75
Idee für Algorithmus:
Erweitere DFS:
Sei G′ = (V ′, E ′) bisher erforschter Teilgraph von G.
Verwalte die SZK' s von G :
Starte mit V ′ = {a}, E ′ = o/ , SZK = {{a}}.
Sei (v,w) die nächste Kante in DFS. Dann ist v ∈ V ′.
Ist w ∉ V ′, d.h. (v, w) ∈ T , dann erweitere SZK um {w}.
Ist w ∈ V ′, dann füge mehrere SZK' s zu einer zusammen
(falls (v, w) ∈ B ∪ C )
Aber wie zusammenfügen?
w ∈V ′
V´
w ∉V ′
V´
*
v
w
Vorlesung Algorithmen (RN/MK/AZ)
w
*
*
v
*
w
WSI für Informatik, Universität Tübingen
v
76
Bezeichnungen:
• SZK K heißt abgeschlossen, wenn alle DFS-Aufrufe für Knoten
in K abgeschlossen sind.
• Wurzel von K ist der Knoten mit kleinster dfsnum in K.
• Folge von Knoten heißt unfertig, falls ihre DFS aufgerufen sind,
aber ihre SZK noch nicht abgeschlossen ist. (Sortiert nach
dfsnum!)
• wurzeln ist Folge der Wurzeln von noch nicht abgeschlossenen
SZK´s. (Sortiert nach dfsnum!)
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
77
Beispiel:
a
c
b
d
h
e
f
unfertig:
wurzeln:
a
a
bc
b
e
e
g
f
f
g
g
Beobachtung:
* g
1. ∀v ∈ unfertig : v 
→
E
2. ∃/(v, w) ∈ E : v in abgeschlossener und
w in nicht abgeschlossener Komponente.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
78
Von g ausgehende Kanten:
( g , d ) ∈ C : tut nichts, d liegt in abgeschlossener SZK.
( g , b ) ∈ B : vereinigt vier Komponenten {b, c}, {e}, { f }, {g}.
unfertig:
wurzeln:
a
a
bcefg
b
( g , h ) ∈ T : erzeuge neue Komponente {h}
Beim Abschluss von DFS(v) teste, ob v Wurzel.
Wenn ja, so gib Komponente mit v als Wurzel aus und streiche
sie aus unfertig und v aus wurzeln.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
79
Operationen auf unfertig und wurzeln erlauben Implementierung
als Keller (Stack):
z.B. Vereinigen von Komponenten:
unfertig
K1
K2
w
K3
K4
v
wurzeln
wurzeln
K2, K3 und K4 werden vereinigt durch pop(wurzeln)
bis top(wurzeln) = Wurzel der SZK von w.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
80
Beispiel (Bestimmung der SZKs durch DFS):
B
s
C
A
L
G
J
E
D
unfertig
H
F
I
K
s A C D E G J K I F H B L
wurzeln s A C D E G J K I F H B L
print
K J G H
Vorlesung Algorithmen (RN/MK/AZ)
F I E D C
A B s
WSI für Informatik, Universität Tübingen
L
81
Korrektheit:
Invarianten:
I1:
I2:
I3:
Zu zeigen:
∃/(v, w) ∈ E mit v in abgeschlossener und w in nichtabgeschlossener SZK.
Nichtabgeschlossene SZK´s liegen auf einem Pfad,
insbesondere ihre Wurzeln liegen auf einem
Baumpfad
Knoten jeder nicht abgeschlossenen Komponente Ki
bilden Intervall in „unfertig“, erstes Element des
Intervalls ist die Wurzel von Ki.
Invarianten bleiben beim Einfügen neuer
Kanten (v, w) ∈ E erfüllt.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
82
1.Fall: (v, w) ∈ T :
push (w, unfertig); push (w, wurzeln)
I1:
Es wird keine SZK abgeschlossen.
I2:
Sei r Wurzel der Komponente von v.
*T v und (v, w) ∈ T
→
Dann r 
*T w
⇒ r
→
I3:
Trivial!
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
83
2.Fall: (v, w) ∈/ T :
a)
w in abgeschlossener SZK: Tue nichts.
b)
w in nicht abgeschlossener SZK: Vereinige
oberste SZK´s bis zu der, in der w liegt.
In a) passiert nichts. Nur b) zu betrachten:
I1:
Es wird keine SZK abgeschlossen...
I2:
Pfad wird verkürzt.
I3:
Löschen der obersten Wurzel vereinigt Intervalle zu
einem neuen. Da vorher I2 galt, bildet dieses eine
Intervall eine einzige Komponente.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
84
Durch nachfolgenden Algorithmus (Programm) erhalten wir:
Satz:
Starke Zusammenhangskomponenten eines gerichteten
Graphen können in Zeit O(n+m) berechnet werden.
Das Hauptprogramm wird erweitert um:
unfertig
wurzeln
leerer Keller
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
85
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
(15)
(16)
(17)
(18)
procedure DFS(v)
besucht[v] := true; z1:= z1+1; dfsnum[v] := z1;
push(v, unfertig); push(v, wurzeln);
for all(v, w) ∈ E do
if not besucht[w] then DFS(w)
else if w ∈ unfertig
then while dfsnum[top(wurzeln )] > dfsnum[w] do
pop(wurzeln) od ;
fi
fi
od
z2 := z2+1; compnum[v] := z2
if v = top(wurzeln)
then repeat w := pop(unfertig)
print(w)
until v = w ;
pop(wurzeln) ;
fi
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
86
Zeilen (13)-(16) : Ausgabe der SZK mit Wurzel v.
Bemerkungen:
•
Test „w ∈ unfertig“ wird mit zusätzlichem booleschen Feld
in_unfertig unterstützt.
•
Jeder Knoten wird höchstens einmal nach unfertig bzw.
wurzeln aufgenommen.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
87
7.5 Minimal aufspannende Bäume (MST)
Sei G(V,E) ein zusammenhängender, ungerichteter Graph.
Sei c:E → R+ eine Kostenfunktion.
Ziel: Berechne ET ⊆ E, sodass G(V,ET) zusammenhängend ist
und c( ET ) := ∑ c(e ) kleinstmöglich ist.
e∈ET
Beispiel:
10
3
1
4
2
3
2
6
2
8
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
88
Anwendungsbeispiele:
• Computer-Netzwerke...
• Elektronische Schaltkreise...
• Netz von Telefonanschlüssen...
uvm.
Lemma:
G(V,ET) ist azyklisch.
Beweis:
Würde G(V,ET) einen Kreis enthalten, so könnte man
eine Kante entfernen, der Graph wäre weiterhin zusammenhängend und die Gesamtkosten geringer.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
89
Wir suchen also einen „aufspannenden Baum“ mit minimalen
Kosten (MST, Minimum Spanning Tree).
Kruskals Greedy-Algorithmus für MST
Sortiere Kanten e1, e2, ... , em so, dass
c(e1 ) ≤ c(e2 ) ≤ ... ≤ c(em );
ET ← o/ ;
for i ← 1 to m do
if (V , ET ∪ {ei }) azyklisch
then ET ← ET ∪ {ei }
fi
od
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
90
Satz:
Der Greedy-Algorithmus von Kruskal ist korrekt, d.h.
er findet immer einen MST.
Beweis:
Eine Kantenmenge E ′ ⊆ E heiße „gut“, falls sie zu
einem MST erweiterbar ist.
Behauptung:
Sei E ′ ⊆ E gut und sei e ∈ E \ E ′ eine billigste Kante,
sodass der Graph (V , E ′ ∪ {e}) azyklisch ist.
Dann ist auch E ′ ∪ {e} gut.
Beweis der Behauptung per Induktion:
Sei T1 = (V , E1 ) ein MST mit E ′ ⊆ E1
(T1 existiert, da E ′ gut ).
Ist e ∈ E1 , so fertig.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
91
Ist e ∉ E1, so betrachte Graph H = (V , E1 ∪ {e}).
H enthält einen Kreis, auf dem e liegt. Da (V , E ′ ∪ {e}) azyklisch
ist, enthält dieser Kreis auch eine Kante aus E1 \ ( E ′ ∪ {e}).
Sei eine solche Kante e1.
Betrachte T2 = (V , ( E1 \ {e1}) ∪ {e}).
T2 ist aufspannend und c(T2 ) = c(T1 ) + c(e ) − c(e1 ).
Da e eine billigste Kante war, gilt c(e ) ≤ c(e1 ).
Also c(T2 ) ≤ c(T1 ).
Da nach Voraussetzung T1 ein MST ist, gilt c(T2 ) = c(T1 ).
D.h. T2 auch ein MST, also E ′ ∪ {e} gut.
Mit der Behauptung folgt die Korrektheit von Kruskals
Algorithmus unmittelbar.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
92
Beispielbild:
T1 : E1
e1
e
T2 : ( E1 \ {e1}) ∪ {e}
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
93
Zur Implementierung:
Wir halten uns eine Partition V1 ∪ V2 ∪ ... ∪ Vk = V
von V : ∀i ≠ j : Vi ∩ V j = o/ und ∀i : Vi ≠ o/ .
Operationen:
Starten mit Partition {{1}, {2}, ... , {n}}.
Benötigen:
•Find(x):
•Union(a,b):
Vorlesung Algorithmen (RN/MK/AZ)
Gibt Namen der Menge zurück,
die x enthält.
Vereinigt die Mengen a und b.
WSI für Informatik, Universität Tübingen
94
Damit wird die for-Schleife in Kruskals Algorithmus zu:
for i ← 1 to m do
sei ei = {u , v};
a ← Find(u );
b ← Find(v );
if a ≠ b
then ET ← ET ∪ {ei };
Union(a,b)
fi
od
Bemerkung:
Auf diese Weise lassen sich i.w. auch die Zusammenhangskomponenten eines Graphen berechnen.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
95
Zur Realisierung der Union-Find-Datenstruktur:
Erste naheliegende Idee:
Realisierung als Feld R[1 .. n], wobei R[x] Name der
Menge sein soll, die x enthält.
Damit:
Find(x):
return R[x]
Union(a,b): for i ← 1 to n do
if R[i ] = a then R[i ] ← b fi
od
Laufzeit:
Find(x):
Union(a,b):
O(1)
O(n)
Algorithmus von Kruskal:
2m Find-Operationen und n-1 Union-Operationen.
Laufzeit Kruskal: O(m+n²+m log m)
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
96
Heuristische Ideen zur Verbesserung:
•Union sollte nicht alle Elemente anschauen...
Verwalte Elemente jeder Menge separat...
•Behalte bei Union immer die Namen der größeren
Mengen.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
97
Also zusätzlich Verwaltung der Mengen als Listen
(samt Größenangabe):
Bild:
Size Elem.
1
2 2
3 5
4 1
R:
Vorlesung Algorithmen (RN/MK/AZ)
wie vorher
WSI für Informatik, Universität Tübingen
98
Damit folgende Implementierung:
Initialis:
Find(x):
Union(a,b):
for x ← 1 to n do
R[x ] ← x;
Elem[x ] ← {x};
size[x ] ← 1;
od
return R[x]
if size[a] < size[b] then „vertausche a und b“ fi;
for all x ∈ Elem[b] do
R[ x ] ← a ;
insert(x, Elem[a])
od;
size[a ] ← size[a ] + size[b]
Beachte: Im Worst Case kann ein Union aber dennoch
Zeit O(n) benötigen.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
99
Satz:
Mit obiger Implementierung lassen sich die Initialisierungen
sowie n-1 Union-Operationen und m Find-Operationen in
Laufzeit O(n ⋅ log n + m ) realisieren.
Beweis:
Initialisierungen:
O(n), klar!
m Find-Operationen: O(m), klar!
n Union-Operationen kosten Zeit O(n log n):
Union(a,b): Vereinige zwei Mengen mit na bzw. nb Elementen;
o.E. sei nb ≤ na ⇒ Laufzeit O(1 + nb ).
Sei ni für i-tes Union die Größe der kleineren Menge. Damit
n −1
Zeit für alle Union-Operationen:  n −1


O ∑ (ni + 1) = O n + ∑ ni .


 i =1

i =1
Immer wenn
ein Element die Menge wechselt, trägt es
n −1
genau 1 zu ∑ ni bei.
i =1
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
100
n −1
n
i =1
j =1
Also ∑ ni = ∑ rj , wobei rj angibt, wie oft Element j die
Menge wechselt.
Behauptung: rj ≤ log 2 n für alle j = 1, 2, ... , n.
Beweis der Behauptung:
Wenn j die Menge wechselt und vorher in einer Menge
mit l Elementen war, so ist j nachher in einer Menge mit
mindestens 2l Elementen.
D.h. nach dem k-ten Wechsel ist j in einer Menge
mit ≥ 2 k Elementen.
Da es nur n Elemente gibt, folgt k ≤ log 2 n.
Mit Hilfe der Behauptung folgt somit, dass n Union-Operationen
Zeit O(n log n) kosten.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
101
Korollar:
Der Algorithmus von Kruskal hat Laufzeit O(m ⋅ log m ) .
Bemerkung:
Obiges ist ein Beispiel für amortisierte Analyse:
Wir betrachten statt Einzeloperationen, welche verschieden
teuer sind, eine Folge von Operationen und stellen fest,
wieviel diese zusammen kosten.
Anderes Beispiel für amortisierte Analyse:
Binärzähler:
Nicht trivial n log n, sondern
2n amortisiert...
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
102
Beispiel (Kruskal, Ungerichteter Graph, nichtnegative Kanten):
1
B
s
2
3
4
1
2
C
5
A
3
6
F
3
6
3
3
E
D
Vorlesung Algorithmen (RN/MK/AZ)
7
H
1
G
5 2 L
3
J
1
1
2
I
4
K
WSI für Informatik, Universität Tübingen
103
Alternative zur vorigen Implementierung:
Idee: Repräsentiere jede Menge durch einen Baum
(i.a. nicht binär):
Jeder Knoten (außer Wurzel) zeigt auf Elternknoten,
Wurzel enthält Namen der Menge.
R[x]
x
Damit:
Union(a,b): „Zusammenhängen“ von Bäumen.
a
b
Zeit: O(1)
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
104
Find(x):
Folge dem Pfad von x zur Wurzel.
Zeit: O(1+Tiefe(x)).
Ideal wäre also Baumtiefe 1...
Im Worst Case können n Union-Op. aber zu Tiefe n-1 führen.
Deshalb: „Gewichtete Vereinigungsregel“:
Hänge immer den kleineren an den größeren Baum
(Baumgröße = Anzahl der Knoten).
Weitere Idee: Pfadkomprimierung
Wenn bei Find der Pfad zur Wurzel zurückverfolgt wird,
so hänge alle Zeiger des Pfades zur Wurzel hin um:
Bild:
x
Vorlesung Algorithmen (RN/MK/AZ)
x
WSI für Informatik, Universität Tübingen
105
Mitteilung:
Mit gewichteter Verzweigungsregel und Pfadkomprimierung
lassen sich die Initialisierungen sowie n-1 Union-Operationen
und m Find-Operationen in Laufzeit O(n + m ⋅α (m + n,n))
realisieren, wobei α die Inverse der Ackermannfunktion ist.
α wächst extrem langsam und ist für alle realistischen
Werte ≤ 5.
Der Beweis obiger Mitteilung ist ziemlich kompliziert.
Vorlesung Algorithmen (RN/MK/AZ)
WSI für Informatik, Universität Tübingen
106
Herunterladen