Sortieren - Lehrstuhl 11 Algorithm Engineering

Werbung
Animation von Dijkstra
Professor Dr. Petra Mutzel
Lehrstuhl für Algorithm Engineering, LS11
Fakultät für Informatik, TU Dortmund
21. VO
DAP2 SS 2009
Petra Mutzel
7. Juli 2009
DAP2 SS09
1
Algorithmus von Dijkstra
Analogien mit BFS und Prim:
• BFS/Prim läßt einzelnen Baum wachsen: Neue
Kante verbindet Baum mit Rest
• Dijkstra bildet Kürzeste-Wege Baum (SPT)
ausgehend von Wurzel s, aber andere Auswahl
• Greedy, Priority Queue
Bezeichnungen
• Vorgänger von Knoten v im SPT: π[v]
• Kanten, die Knotenmenge S verlassen: A(S)
• Min. Abstand vom Startknoten zu Knoten v: d[v]
Petra Mutzel
DAP2 SS09
2
Idee von Dijkstra
S := {s}
// S Knoten im SPT
d[s] := 0; π[s] := nil
// s Wurzel
while A(S) ≠ ø do
// erreichbare Knoten
// Optimale Substruktur
Sei e = (u, v)  A(S) mit d[u] + w(e) minimal
Realisierung durch
PQ und edge scanning
S := S ⋃ {v}
d[v] := d[u] + w(e)
π[v] := u
end while
Petra Mutzel
DAP2 SS09
3
Realisierung von Dijkstra
• Knotenmenge S: Kürzester Weg mit Länge d[v]
bereits ermittelt
• Knotenmenge V \ S: Speichere vorläufige Werte
für den Abstand zu s (obere Schranke (v) 
d[v]) in Priority Queue, und aktualisiere Priorität,
falls günstigerer Weg gefunden wird, (s) = 0
1. Wähle mit EXTRACTMIN Knoten u mit
minimalem Abstandswert. Start: (s) = d[s] = 0
2. Aktualisiere für ausgehende Kanten (u, v)
Abstandswerte der Endknoten („Relaxieren“) mit
DECREASEPRIORITY und Vorgänger π[v]
Petra Mutzel
DAP2 SS09
4
Pseudo-Code: Initialisierung
G=(V, A), w: A→R0+
(1) var π[V], PriorityQueue Q, pos[V]
(2) for each u  V \ {s} do {
(3)
pos[u] := Q.INSERT(, u)
(4)
π[u] := nil
(5) }
(6) pos[s] := Q.INSERT(0, s)
(7) π[s] := nil
Petra Mutzel
DAP2 SS09
5
Pseudo-Code
(8) while not Q.ISEMPTY() do {
(9)
(du, u ) := Q.EXTRACTMIN(); // du Abstand s zu u
(10) pos[u] := nil
// Minimum entfernt
(11) for all e = (u,v)  A-(u) do {
// Erreichbare Knoten
(12)
if du+w(e) < Q.PRIORITY(pos[v]) then {
(13)
Q.DECREASEPRIORITY(pos[v], du + w(e))
(14)
π[v] := u
(15)
}
(16) }
(17) }
Petra Mutzel
DAP2 SS09
6
Algorithmus von Dijkstra
22

s 
0

9
2
12


10
4
2

7
4
11
7

8
4
5

1

5
Priority Queue PQ: Knoten, Priorität Weglänge
Kandidatenmenge K in PQ: Weg von s gefunden
Abgeschlossene Knoten: Minimum aus PQ
Petra Mutzel
DAP2 SS09
7
Algorithmus von Dijkstra
22

4

9
s 0
2
12

12

10
4
2

7
4
11
7

8
4
5

1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
8
Algorithmus von Dijkstra
22

4

9
s 0
2
12

12

26
10
4
2

7
4
11
7

8
4
5

1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
9
Algorithmus von Dijkstra
22
4


9
s 0
2
12
12
26
10
4
2

7
4
11
7

8
4
5

1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
10
Algorithmus von Dijkstra
22
4

26
10
4
2
9
14
2
7

8
4
12
12
7
4
11
s 0

5
17
1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
11
Algorithmus von Dijkstra
22

4
26
10
4
2
9
14
2
12
12
7
4
11
s 0

7

8
4
5
17
1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
12
Algorithmus von Dijkstra
22

4
25
10
4
2
9
14
2
12
12
7
4
11
s 0

7

8
4
5
17
1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
13
Algorithmus von Dijkstra
22

4
25
10
4
2
9
14
2
7

8
4
12
12
7
4
11
s 0

5
17
1

5
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
14
Algorithmus von Dijkstra
22

4
25
10
4
2
9
14
2
12
7
4
11
s 0

7

8
4
5
12
5
17
1
18
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
15
Algorithmus von Dijkstra
22

4
22
10
4
2
9
14
2
7
4
11
s 0
26
7
23
8
4
5
12
12
5
17
1
18
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
16
Algorithmus von Dijkstra
22

4
22
10
4
2
9
14
2
7
4
11
s 0
26
7
23
8
4
5
12
12
5
17
1
18
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
17
Algorithmus von Dijkstra
22

4
22
10
4
2
9
14
2
7
4
11
s 0
26
7
23
8
4
5
12
12
5
17
1
18
Ausgehende Kanten des gewählten Knoten
Erreichte Kandidaten
Vorgänger-Kanten: π
Petra Mutzel
DAP2 SS09
18
Herunterladen