Kürzeste Wege und Stacks

Werbung
Themen der Übung
Kürzeste Wege und Stacks
Themen heute
Nachtrag: SimpleStack.toString()
Nachtrag: Beweis aus der Vorlesung
CoMa-Übung IX
Algorithmus von Floyd-Warshall
Kürzeste Wege aus der Tree-Matrix berechnen
TU Berlin
Adjazenzlisten und -matrizen
19.12.2012
Tiefensuche
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
19.12.2012
1 / 21
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
Nachträge
Floyd-Warshall-Algorithmus
SimpleStack.toString()
Geschichte
1
2
3
4
5
6
7
8
9
10
11
2 / 21
1962 unabhängig von Floyd und Warshall publiziert.
/∗ ∗
∗ Returns a s t r i n g r e p r e s e n t a t i o n of t h i s stack , top
element f i r s t .
∗ @return a String r e p r e s e n t i n g t h i s stack .
∗/
public String toString () {
S t r i n g s t r = ”” ;
f o r ( L i s t N o d e <T> c u r r = t o p ; c u r r != n u l l ; c u r r = c u r r
. getNext () ) {
s t r = s t r + c u r r . getData ( ) . t o S t r i n g ( ) ;
}
return s t r ;
}
Robert W. Floyd. → Diese Version machen wir hier.
Algorithm 97 (SHORTEST PATH).
Communications of the ACM, 5(6): 345, 1962.
Stephen Warshall.
A Theorem on Boolean Matrices.
Journal of the ACM, 9(1): 11-12, 1962.
Idee
Bellman-Ford: Berechne kürzeste Wege mit maximal 1, 2, 3, . . .
Kanten.
Floyd-Warshall: Berechne kürzeste Wege die nur Zwischenstopps in ∅,
{v1 }, {v1 , v2 }, . . . machen.
Beweis Stackbedingung
eKreide
CoMa-Übung IX (TU Berlin)
19.12.2012
Kürzeste Wege und Stacks
19.12.2012
3 / 21
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
19.12.2012
4 / 21
Floyd-Warshall-Algorithmus (2)
Floyd-Warshall-Algorithmus (3)
Formalisierung der Idee
Berechnen der dist(v , w , X )
Initialisierung: dist(v , w , ∅) := avw .
dist(v , w , X ) := Länge eines kürzesten v -w -Weges, der nur Knoten
aus {v , w } ∪ X besucht
Zurückführung auf leichtere Fälle: dist(v , w , {x1 , . . . , xk }) = min{
I
Beobachtungen
I
Wir sind an den dist(v , w , V ), v , w ∈ V interessiert.
dist(v , w , ∅) ist leicht zu berechnen:
I
dist(v , w , {x1 , . . . , xk−1 }),
dist(v , xk , {x1 , . . . , xk−1 }) + dist(xk , w , {x1 , . . . , xk−1 })
}.
xk
dist(v , w , ∅) := avw (für eine Entfernungsmatrix A = (a)ij ).
{x1 , . . . , xk−1 }
dist(v , w , {x}) auch:
I
I
dist(v , w , {x}) = min{dist(v , w , ∅), dist(v , x, ∅) + dist(x, w , ∅)}.
Entweder der direkte Weg oder der Umweg über den einzig erlaubten
Zwischenstopp x ist besser.
v
CoMa-Übung IX (TU Berlin)
w
Kürzeste Wege und Stacks
19.12.2012
5 / 21
CoMa-Übung IX (TU Berlin)
Tree-Matrizen
Code
Idee:
Für i = 1, . . . , n − 1:
Für v = 0, . . . , n − 1:
F
F
F
I
Für w = 0, . . . , n − 1: dist(v , w , {0, . . . , i}) := min{
dist(v , w , {0, . . . , i − 1}),
dist(v , i, {0, . . . , i − 1}) + dist(i, w , {0, . . . , i − 1})
}.
6 / 21
Updates in der innersten Schleife des Bellman-Ford-Algorithmus:
1
2
3
3 verschaltete Schleifen von 0 bis n − 1.
4
Größenordnung von n3 Operationen nötig.
5
(n3 log n
Schneller als die Bellman-Ford-Varianten aus der VL
n4 ) – es gibt aber auch schnellere Bellman-Ford-Varianten.
Kürzeste Wege und Stacks
tree[i][j] – speichert Vorgängerknoten von j auf dem i-j-Weg.
Initialisierung: tree[i][j] = i falls (i, j) ∈ E , tree[i][j] = -1
sonst.
Aufwand
CoMa-Übung IX (TU Berlin)
19.12.2012
Speichere, wie die Minima gebildet wurden (→ Tree-Matrix).
Bellman-Ford:
Für w = 0, . . . , n − 1 : dist(v , w , ∅) := avw .
F
Kürzeste Wege und Stacks
Bellman-Ford und Floyd-Warshall bilden wiederholt Minima.
Für v = 0, . . . , n − 1:
I
w
Rückführung auf den Fall mit einem Zwischenstopp weniger.
Floyd-Warshall-Algorithmus (4)
I
{x1 , . . . , xk−1 }
Entweder ist xk ein hilfreicher Zwischenstopp für einen kürzesten
v -w -Weg oder nicht.
x
v
{x1 , . . . , xk−1 }
6
bzw.
19.12.2012
f o r ( i n t k = 0 ; k < n ; k++) {
i f (u [ i ] [ j ] > u [ i ] [ k ] + a [ k ] [ j ]) {
u[ i ][ j ] = u[ i ][ k] + a[k ][ j ];
tree [ i ][ j ] = k ;
}
}
Für jeden Startknoten v lässt sich aus tree[v] ein kürzester
Wege-Baum berechnen.
7 / 21
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
19.12.2012
8 / 21
Datenstrukturen für Graphen
Tree-Matrizen (2)
Graphen sind ein wichtiges Modellierungswerkzeug
Müssen irgendwie gespeichert werden
Bisher: Adjazenzmatrizen
Jetzt: Adjazenzlisten
Beispiel:
1
2
1
5
4
2
1
-1 1
-1
1
2
Adjazenzmatrizen: Beispiel
6 5
-3
0
0
0
0
0
-3
3
2
1
1
2
3
4
5
5
3
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
Der kürzeste Wege Baum für den Startknoten 1.
Die Einträge von tree[1].
Ein kürzester 1-6-Weg lässt sich dann aus schrittweise aus der Matrix
ablesen: 1 → 2 → 3 → 5 → 6
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
19.12.2012
9 / 21
Blöd: nur n Knoten & n − 1 Kanten, aber n2 Platz für die Matrix
nötig
Adjazenzlisten zum Platzsparen
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
Adjazenzlisten
Ein weiteres Beispiel
Idee
(Gerichteter) Petersen-Graph
Jeder Knoten besitzt Liste seiner Nachbarn
4
5
6
Knoten 4: {5,9}
7
Knoten 2: {3}
10
Knoten 3: {4}
3
Knoten 5: {}
9
Gut: n Knoten & n − 1 Kanten, in der Größenordnung von n Platz
nötig
19.12.2012
11 / 21
Knoten 5: {1,10}
Knoten 7: {9,10}
4
Kürzeste Wege und Stacks
5
Knoten 6: {8,9}
8
Knoten 4: {5}
CoMa-Übung IX (TU Berlin)
12 / 21
Knoten 3: {4,8}
2
Knoten 1: {2}
3
19.12.2012
Knoten 2: {3,7}
1
2
10 / 21
Knoten 1: {2,6}
Beispiel
1
19.12.2012
Knoten 8: {10}
Knoten 9: {}
Knoten 10: {}
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
Ein ungerichtetes Beispiel
Vorteile und Nachteile von Adjazenzlisten
Petersen-Graph
Vorteile
Knoten 1: {5,2,6}
Braucht für dünne Graphen (um n Kanten) weniger Speicher als
Matrizen
Beschleunigt Algorithmen auf dünnen Graphen, die
Knoten 2: {1,3,7}
1
Knoten 3: {2,4,8}
2
6
7
10
5
I
Knoten 5: {4,1,10}
I
Knoten 6: {1,8,9}
8
9
3
Knoten 4: {3,5,9}
Nachteile
Knoten 7: {2,9,10}
Test, ob eine Kante im Graph ist, dauert länger
Knoten 8: {3,6,10}
4
alle Nachbarn eines Knoten oder
alle Knoten des Graphen betrachten
Erfordert für dichte Graphen (um n2 Kanten) mehr Speicher als
Matrizen (Overhead durch Listen)
Knoten 9: {4,6,7}
Knoten 10: {5,7,8}
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
19.12.2012
13 / 21
Tiefensuche
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
19.12.2012
14 / 21
Tiefensuche mit vorgegebenem Startknoten
Ideen
Algorithmus zur systematischen Suche in Graphen
Beginne bei Startknoten
Eingabe: Graph G = (V , E ), manchmal auch Startknoten s ∈ V
Benutze Adjazenzlisten, um neue Knoten zu finden
Markiere Knoten:
Ausgabe: Anwendungsabhängig
Anwendungen:
I
I
I
I
I
I
I
Zusammenhängende Komponenten eines Graphen bestimmen
Kreise finden
Wege zwischen zwei Knoten finden
Baum / Wald, der alle Knoten enthält
...
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
19.12.2012
I
Weiß für noch nicht besuchte Knoten
Orange für besuchte Knoten, von denen wir weitersuchen können
Rot für besuchte Knoten, von denen wir nicht weitersuchen können
Benutze einen Stack
weitersuchen können
, um Knoten zu merken, von denen wir
Nummeriere die Knoten in der Reihenfolge, in der sie gefunden
werden (nett für einige Anwendungen)
15 / 21
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
19.12.2012
16 / 21
Tiefensuche mit vorgegebenem Startknoten
Tiefensuche – Beispiel
Basis-Algorithmus mit Startknoten s
Färbe alle Knoten weiß s
a
b
...
gk
Erzeuge einen leeren Stack
di
Lege s auf den Stack s
Solange der Stack nicht leer ist: Betrachte den obersten Knoten v
v
des Stacks
I
F
I
d
e
b
19.12.2012
k
f
j
17 / 21
Tiefensuche – Laufzeit, Speicherplatz und
Kantenklassifizierung
c
b
h
c
Falls v orange ist: Färbe den Knoten rot v → v und entferne ihn
vom Stack
Falls v rot ist: Nimm den Knoten vom Stack
Kürzeste Wege und Stacks
b
i
s
v erhält die nächste freie Nummer
Weiße Nachbarn w werden auf den Stack gelegt (Adjazenzliste
durchlaufen)
CoMa-Übung IX (TU Berlin)
hf
a
Falls v weiß ist: Färbe den Knoten orange v → v
F
I
ej
g
a
s
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
gk
Speicherplatz: für jede Kante wird maximal einmal ein Knoten auf
den Stack gelegt
di
Laufzeit und Speicherplatz linear in der Anzahl der Kanten
ej
g
10
11
d
I
9e
7
b
19.12.2012
20 / 21
b
6i
1s
Anwendungsbeispiel: Gerichtete Zykel aus Digraph entfernen
Kanten betrachten, sobald beide Knoten gefärbt wurden
hf
a
12
Farben und Knotennummern erlauben Klassifikation der Kanten →
für Anwendungen interessant
I
18 / 21
Tiefensuche – Beispiel mit Nummerierung
Laufzeit: jede Kante wird genau einmal betrachtet
I
19.12.2012
5k
8f
4j
1 → 2 : okay
1 → : okay
2 → 1 : gerichteter Zykel
2c
3
h
c
b
a
s
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
19.12.2012
19 / 21
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
Frohe Weihnachten und einen guten Rutsch!
Euer CoMa-Team
CoMa-Übung IX (TU Berlin)
Kürzeste Wege und Stacks
19.12.2012
21 / 21
Herunterladen