Rekapitulation: Darstellung von Graphen

Werbung
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 319, Seite 77 im Skript)
Rekapitulation: Darstellung von Graphen
Adjazenzliste
1
2
3
4
5
1
2
3
4
5
2,
1,
1,
2,
2,
3
3, 4, 5
2, 5
5
3, 4
Alle bisherigen Algorithmen:
Adjazenzliste gute Darstellung
Kritische Operation: Alle ausgehenden Kanten besuchen.
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 320, Seite 77 im Skript)
All Pairs Shortest Paths
Eingabe: Gerichteter Graph mit Kantengewichten
Ausgabe: Abstände und kürzeste Wege zwischen allen
Knotenpaaren
Laufzeit O((|V |2 + |V | · |E |) log |V |) mit Dijkstra.
→ Wende Dijkstra auf jeden Knoten an.
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 321, Seite 77 im Skript)
Algorithmus von Floyd
Algorithmus
procedure Floyd1 :
for i = 1, ..., n do
for j = 1, ..., n do d[i, j, 0] := length[i, j] od
od;
for k = 1, ..., n do
for i = 1, ..., n do
for j = 1, ..., n do
d[i, j, k] := min{d[i, j, k − 1], d[i, k, k − 1] + d[k, j, k − 1]}
od
od
od
Der Abstand von i nach j ist in d[i, j, n] zu finden.
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 322, Seite 77 im Skript)
Theorem
Die kürzesten Wege zwischen allen Knotenpaaren eines gerichteten
Graphen G = (V , E ) können in O(|V |3 ) Schritten gefunden
werden.
Beweis.
Per Induktion: d[i, j, k] enthält die Länge des kürzesten Pfades von
i nach j, wenn nur 1, . . . , k als Zwischenstationen erlaubt sind.
Dann enthält d[i, j, n] den wirklichen Abstand.
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
Algorithmus von Floyd
Einfachere Version:
Algorithmus
procedure Floyd :
for i = 1, ..., n do
for j = 1, ..., n do d[i, j] := length[i, j] od
od;
for k = 1, ..., n do
for i = 1, ..., n do
for j = 1, ..., n do
d[i, j] := min{d[i, j], d[i, k] + d[k, j]}
od
od
od
(Folie 323, Seite 77 im Skript)
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 324, Seite 77 im Skript)
Spezialfall: Transitive Hülle – Algorithmus von Warshall
Frage: Zwischen welchen Knotenpaaren gibt es einen Weg?
Algorithmus
procedure Warshall :
for i = 1, ..., n do
for j = 1, ..., n do D[i, j] := A[i, j] od
od;
for k = 1, ..., n do
for i = 1, ..., n do
for j = 1, ..., n do
D[i, j] := D[i, j] || D[i, k] && D[k, j]
od
od
od
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 325, Seite 77 im Skript)
Transitive Hülle
Theorem
Wir können die transitive Hülle eines gerichteten Graphen
G = (V , E ), der k starke Zusammenhangskomponenten hat, in
O(|V | + |E 0 | + k 3 ) Schritten berechnen, wobei E 0 die Kanten der
transitiven Hülle sind.
Beweis.
1 Berechne die starken Zusammenhangskomponenten
2
Schrumpfe jede SCC X zu einem Knoten
3
Berechne die transitive Hülle H dieses Graphen
4
Für jede Kante (X , Y ) in H gib alle Kanten (x, y ) mit
x ∈ X , y ∈ Y aus.
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 326, Seite 78 im Skript)
Breitensuche
7/
4/
8/
2/6
3/
1/5
Breitensuche ist das Gegenteil“ von Tiefensuche.
”
Tiefensuche: Aktive Knoten auf Stack
Breitensuche: Aktive Knoten in FIFO-Queue
Intelligente Suche: Weder Stack noch Queue
Breitensuchbaum enthält kürzeste Pfade (ungewichtet)
Discovery- und Finishzeiten wenig Anwendungen
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 327, Seite 78 im Skript)
Breitensuche
2
1
2
1
1
0
Knoten wird aktiv:
Abstand berechnen und Kante in BFS-Baum
Anwendung:
Alle Abstände und kürzesten Wege von s berechnen
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 328, Seite 78 im Skript)
Breitensuche – Größeres Beispiel
0
1
1
1
2
2
2
4
4
3
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
Java
(Folie 329, Seite 78 im Skript)
public void BFS(Node s, MaphNode, Nodei p) {
SimpleIterator hNodei it;
MaphNode, Integer i color = new HashtablehNode, Integer i();
QueuehNodei q = new QueuehNodei();
for(it = nodeiterator (); it.more(); it.step()) {
it.key ().weight = 1.0e10 ; color .insert(it.key (), 0); } // white
s.weight = 0.0; q.enqueue(s); color .insert(s, 1); // gray
while(!q.isempty ()) {
Node v = q.dequeue();
Iterator hNode, Edgei adj;
for(adj = neighbors.find(v ).iterator (); adj.more(); adj.step()) {
Node u = adj.key ();
if(color .find(u) ≡ 0) {
color .insert(u, 1); // gray
u.weight = v .weight + 1; p.insert(u, v ); q.enqueue(u);
}
}
color .insert(v , 2); // black
}
}
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 330, Seite 78 im Skript)
Breitensuche
Theorem
Gegeben sei ein gerichteter oder ungerichteter Graph G = (V , E )
und ein Knoten s ∈ V .
Die kürzesten Wege von s zu allen anderen Knoten und die
zugehörigen Abstände können in O(|V | + |E |) berechnet werden.
Beweis.
Wir verwenden Breitensuche.
Die Laufzeit ist offensichtlich linear.
Der Korrektheitsbeweis sei hier weggelassen (etwas lang und
technisch).
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
Beispiel
(Folie 331, Seite 78 im Skript)
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 332, Seite 78 im Skript)
Beispiel: DFS
51
50
45
44
41
40 139 141 142 143 151 150 152 153 154
52
49
46
43
42
39
53
48
47 137 138 122 37
54
55
60
61 123 121 120 131 117 33 149
136 56
59
62 124 125 119 118 116 32
135 57
58
63 127 126 132 110 111 112 30
134 69
68
64 128 129 130 109 114 113 29
133 70
67
65
98
99 100 108 104 115 28
38 140
36
144 145 146
35
34 148 147
31
72
71
77
66
97
96 101 102 103 107 27
73
75
76
78
79
95
94
93 105 106 26
25
81
80
82
83
87
88
19
20
23
24
5
6
84
85
86
89
18
21
22
7
8
92
91
90
17
16
9
10
11
12
13
14
74
4
2
1
3
15
158 159 161 163 164
155 156 157 160 162
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 333, Seite 78 im Skript)
Beispiel: BFS
77
73
59
57
53
50
47
52
56
58
71
68
72
76
80
91
88
90
94
96 100
81
69
61
55
51
48
46
49
62
60
63
65
75
78
82
84
86
93
97
99
83
66
64
45
44
43
42
70
67
79
85
87
41
74
40
39
89
98
92
95
54
37
36
38
35
34
5
7
4
6
8
2
3
18
9
10
1
17
15
13
11
12
14
16
33
32
31
26
27
30
25
28
29
23
21
24
19
20
22
Datenstrukturen und Algorithmen
Graphalgorithmen
Kürzeste Pfade
(Folie 334, Seite 78 im Skript)
Beispiel: LC
42
44
41
43
40
39
45
46
47
38
50
48
49
37
36
35
33
32
31
34
30
29
5
4
2
1
3
6
7
8
9
10
11
12
13
28
27
26
21
22
25
20
23
24
19
16
17
14
15
18
51
52
53
54
57
55
56
58
59
60
61
Herunterladen