22. Vorlesung (22.01.2013)

Werbung
Algorithmen und Datenstrukturen
Wintersemester 2012/13
22. Vorlesung
Tiefensuche und Topologische Sortierung
Prof. Dr. Alexander Wolff
Lehrstuhl für Informatik I
Vorlesungsumfrage
Nutzen Sie die Vorlesungsbefragung – zu konstruktiver Kritik!
Von besseren Vorlesungen profitieren
!
Sie (wenn Sie die nächste Veranstaltung bei mir hören)
Ihre Nachfolger (im nächsten Wintersemester)
ich (Gute Lehre macht Spaß! Gute Klausurergebnisse auch!)
Vielen Dank!
Tiefensuche
Eingabe:
u
(un)gerichteter Graph G
discovery finish
time
time
π
1/–
1/8
V
Ausgabe: – Besuchsintervalle
(
u
.
d
/
u
.
f
)
4/5
4/–
π
– DFS-Wald
x
v
w
2/–
2/7
9/12
9/–
K
R
3/–
3/6
10/11
10/–
z R
– Klassifizierung der Graphkanten: Farbe Zielknoten:
• Baumkanten (Kanten von Gπ ) weiss
y
Kanten des DFS-Baums (in Gegenrichtung)
• Rückwärtskanten (R)
grau
Nicht-Baumkanten zu einem Vorgängerknoten
• Vorwärtskanten (V)
Nicht-Baumkanten zu einem Nachfolgerknoten
• Kreuzkanten (K)
Kanten, bei denen kein Endpunkt Vorgänger des anderen ist.
schwarz und
start.d < ziel.d
schwarz und
start.d > ziel.d
Tiefensuche – Pseudocode
u
1/8
DFS(Graph G = (V , E ))
foreach u ∈ V do
V R
u .color = white
4/5
u .π = nil
x
time = 0 // globale Variable!
foreach u ∈ V do
if u .color == white then DFSVisit(G , u )
DFSVisit(Graph G , Vertex u )
time = time + 1
u .d = time; u .color = gray
foreach v ∈ Adj[u ] do
if v .color == white then
v .π = u ; DFSVisit(G , v )
time = time + 1
u .f = time; u .color = black
v
w
2/7
9/12
K
3/6
y
10/11
z R
Laufzeit
von DFS?
DFSVisit wird nur für
weiße Knoten aufgerufen.
In DFSVisit wird der neue
Knoten sofort gefärbt.
⇒ DFSVisit wird für jeden
Knoten genau 1× aufgerufen.
DFS ohne if
O(V ) Zeit
DFSVisit ohne Rek. O(deg u)
DFS gesamt
O(V + E ) Zeit
Tiefensuche – Eigenschaften
3/6
4/5
y
z
2/9
7/8
x
1/10
w
12/13
s
11/16
14/15
v
t
u
s z y (x x) y w w z s
t v v u u t
s
t
B
z
v
u
V
R
1 2
y
w
x
K
5
10
15
time
Tiefensuche – Sätze
Satz.
(Klammerntheorem)
V
2
Nach DFS(G ) gilt für {u , v } ∈
genau eine der Bedingungen
(i) Besuchsintervalle disjunkt und
Baumkanten enthalten weder u -v - noch v -u -Weg.
(ii) [u .d , u .f ] ⊂ [v .d , v .f ] und Baumkanten enthalten v -u -Weg.
(iii) Wie (ii), nur umgekehrt.
Beweis. Wir betrachten zwei Fälle.
1. Fall: u .d < v .d .
A) v .d < u .f ,. d.h. v wurde entdeckt, als u noch grau war.
⇒ v ist Nachfolger von u , d.h. es gibt einen u -v -Weg.
Wegen u .d < v .d gilt: v wurde später als u entdeckt.
⇒ alle Kanten, die v verlassen sind erforscht; v wird
schwarz, bevor DFG zu u zurückkehrt und u schwarz
macht. ⇒ [v .d , v .f ] ⊂ [u .d , u .f ]
X
Tiefensuche – Sätze
Satz.
(Klammerntheorem)
V
2
Nach DFS(G ) gilt für {u , v } ∈
genau eine der Bedingungen
(i) Besuchsintervalle disjunkt und
Baumkanten enthalten weder u -v - noch v -u -Weg.
(ii) [u .d , u .f ] ⊂ [v .d , v .f ] und Baumkanten enthalten v -u -Weg.
(iii) Wie (ii), nur umgekehrt.
Beweis. Wir betrachten zwei Fälle.
X
X
B) u .f < v .d . X
1. Fall: u .d < v .d .
A) v .d < u .f .
2. Fall: v .d < u .d . Symmetrisch!
X
(Vertausche im Beweis u ↔ v .)
Laut Code gilt u .d < u .f < v .d < v .f (siehe Code).
⇒ [u .d , u .f ] ∩ [v .d , v .f ] = ∅
⇒ Keiner der beiden Knoten wurde entdeckt, während
der andere noch grau war., d.h. keiner Nachf. des anderen.
Noch mehr Sätze!
Satz.
(vom weißen Pfad)
Der DFS-Wald von G enthält einen u -v -Weg ⇔
zum Zeitpunkt u .d , wenn u entdeckt wird, enthält G
einen u -v -Weg, der nur aus weißen Knoten besteht.
Satz.
G ungerichtet ⇒ G hat nur Baum- und Rückwärtskanten.
Beweis. Sei uv (kurz für {u , v }) eine beliebige Kante von G .
O.B.d.A. gilt u .d < v .d .
Dann entdeckt DFS v und färbt v schwarz, bevor u schwarz
gefärbt wird (da v ∈ Adj[u ]).
Falls DFS uv zum ersten Mal von u nach v überschreitet,
ist v zu diesem Zeitpunkt weiss. Dann ist uv Baumkante.
Andernfalls ist uv R-Kante, da u schon (und immer noch)
grau ist, wenn uv zum 1. Mal überschritten wird (und zwar
von v nach u ).
Ablaufplanung
Kante bedeutet:
Unterhose vor
Hose anziehen!
1/8
2/7
Hose
5/6
Gürtel
14/15
Schal
Unterhose
Socken 19/20
Schuhe 3/4
Uhr
9/10
T-Shirt 11/18
Anorak
Pulli 12/17 DFS-Besuchsintervalle
Topologische Sortierung: Lineare Ordnung der Knoten, so dass
aus (u , v ) ∈ E folgt: u kommt vor v .
13/16
19/20
11/18
12/17
13/16
14/15
Socken
T-Shirt
Pulli
Anorak
Schal
Uhr
Unterhose
Hose
Gürtel
Schuhe
9/10
1/8
2/7
5/6
3/4
Topologisch sortieren
Topologische Sortierung: Lineare Ordnung der Knoten, so dass
aus (u , v ) ∈ E folgt: u kommt vor v .
Def.
TopologicalSort(DirectedGraph G )
L = new List()
Laufzeit?
DFS(G ) mit folgender Änderung:
Wenn ein Knoten schwarz gefärbt wird, O (V + E )
häng ihn vorne an die Liste L an.
return L
Beweise:
Tafel bzw.
Ein (gerichteter) Graph ist kreisfrei,
Kapitel 22.4
wenn er keinen (gerichteten) Kreis enthält.
[CLRS]
Lem.
Ein gerichteter Graph G ist kreisfrei
⇔ DFS(G ) liefert keine Rückwärtskanten.
Satz.
Sei G ein gerichteter kreisfreier Graph. Dann liefert
TopologicalSort(G ) eine topologische Sortierung von G .
Herunterladen