Tiefensuche – Überblick (1)

Werbung
Tiefensuche – Überblick (1)
Die Tiefensuche durchsucht wie die Breitensuche
einen Graphen.
Allerdings wird immer eine Kante vom zuletzt entdeckten Knoten v erforscht. Gibt es keine solche
Kante mehr, wird zum Knoten, von dem aus v entdeckt wurde, zurück gegangen (backtracking).
Suche wird so lange fortgesetzt, wie noch nicht besuchte Knoten existieren.
Sind alle von einem Knoten aus erreichbaren Knoten
entdeckt und existieren noch unentdeckte Knoten,
so beginnt Tiefensuche mit einem noch nicht entdeckten Knoten.
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
1
Tiefensuche – Überblick (2)
Definieren Vorgänger π[v ] wie bei Breitensuche
und definieren Gπ := (V,E π ) durch
E π := {(π[v ], v ) | v ∈ V }.
Gπ ist kein Baum, sondern nur ein Wald, d.h. ein
Graph zusammengesetzt aus Bäumen auf disjunkten Knotenmengen. Dieser Wald wird Tiefensuch-Wald genannt.
Benutzen Färbung von Knoten wie bei Breitensuche.
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
2
Tiefensuche – Überblick (3)
Definieren zusätzlich zu π[v ], d[v ] noch Feld f [v ].
Dabei ist d[v] der Zeitpunkt, an dem v entdeckt wird
und f [v ] ist der Zeitpunkt, an dem Adj[v ] vollständig
untersucht wurde.
Es gilt 1 ≤ d[v ] < f [v ] und f [v ] ≤ 2 V . Denn in jedem
Schritt wird ein neuer Knoten entdeckt oder die Durchsuchung eine Adjazenzliste wird beendet.
Vor d[v ] ist v weiss, zwischen d[v ] und f [v ] ist v grau,
nach f [v ] ist v schwarz.
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
3
Pseudocode für Tiefensuche
DFS (G )
1 for jeden Knoten u ∈ G
2
do color [u] ← WHITE
3
π [u] ← NIL
4 time ← 0
5 for jeden Knoten u ∈ G
6
7
do if color [u] = WHITE
then DFS - Visit(u)
DFS − Visit (u )
1 color [u] ← GRAY
2 time ← time + 1
3 d[u] ← time
4 for jeden Knoten v ∈ Adj [u ]
5
6
do if color [v ] = WHITE
then π [v ] ← u
7
DFS - Visit(v )
8 color [u] ← BLACK
9 time ← time + 1
10 f [u] ← time
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
4
Illustration Tiefensuche (1)
u
1/
v
w
u
1/
v
2/
w
x
y
z
x
y
z
u
1/
v
2/
w
u
1/
v
2/
w
4/
3/
x
y
3/
x
SS 2006
y
z
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
z
5
Illustration Tiefensuche (2)
u
1/
v
2/
w
u
1/
v
2/
w
B
4/
3/
x
y
u
1/
v
2/
z
w
4/5
3/
x
y
u
1/
v
2/7
w
B
B
4/5
3/6
x
y
SS 2006
z
z
4/5
3/6
x
y
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
z
6
Illustration Tiefensuche (3)
u
1/
v
2/7
w
B
F
4/5
3/6
x
y
z
u
1/8
v
2/7
w
9/
F
B
3/6
x
y
z
v
2/7
w
B
4/5
3/6
x
y
u
1/8
F
4/5
SS 2006
u
1/8
z
v
2/7
C
B
4/5
3/6
x
y
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
w
9/
z
7
Illustration Tiefensuche (4)
u
1/8
F
v
2/7
4/5
3/6
x
y
u
1/8
v
2/7
F
v
2/7
w
9/
C
B
4/5
3/6
10/
z
x
y
z
w
9/
u
1/8
v
2/7
w
9/
C
B
F
4/5
3/6
10/
x
y
z
SS 2006
u
1/8
C
B
F
w
9/
B
C
B
4/5
3/6
10/11
x
y
z
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
B
8
Illustration Tiefensuche (5)
u
v
1/8
F
SS 2006
2/7
9/12
C
B
4/5
x
w
3/6
y
10/11
z
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
B
9
Tiefensuche - Laufzeitanalyse
Satz 15.8: Bei Eingabe von Graph G=(V,E) besitzt
Algorithmus DFS Laufzeit O ( V + E ).
Analyse: Wie bei Breitensuche. Nutzen aus dass
Gesamtgröße aller Adjazenzlisten O (E )
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
10
Tiefensuche – Eigenschaften (1)
Satz 15.9: Für jede Tiefensuche eines gerichteten oder
ungerichteten Graphen G=(V,E) und für je zwei
Knoten u,v des Graphen G trifft genau eine der drei
folgenden Aussagen zu:
1. Die Intervalle [d[u ], f [u ]] und [d[v ], f [v ]] sind disjunkt
und weder u noch v ist im Tiefensuch-Wald ein
Nachfahre des jeweils anderen Knotens.
2. Das Intervall [d[u ], f [u ]] ist im Intervall [d[v ], f [v ]]
enthalten und im Tiefensuch-Wald ist u ein
Nachfahre von v.
3. Das Intervall [d[v ], fv ] ist im Intervall [d[u ], f [u ]]
enthalten und im Tiefensuch-Wald ist v ein
Nachfahre von u.
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
11
Tiefensuche – Eigenschaften (2)
Korollar 15.10: Im Tiefensuch-Wald ist Knoten v ein
Nachfahre von Knoten u ≠ v dann und nur dann, wenn
gilt d[u] < d[v ] < f [v ] < f [u].
Satz 15.11: Im Tiefensuch-Wald eines Graphen G=(V,E)
ist v ein Nachfahre von u dann und nur dann, wenn
zum Zeitpunkt, an dem die Suche u entdeckt, v von u
aus auf einem Pfad erreichbar ist, der nur weisse
Knoten enthält.
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
12
Ergebnis einer Tiefensuche mit Klammerung
y
z
s
t
3/6
2/9
1/10
11/16
F
B
4/5
C
x
7/8
C
C
w
12/13
v
B
14/15
C
u
s
t
z
v
y
u
w
x
1
(s
SS 2006
2
(z
3
(y
4
(x
5
x)
6
y)
7
(w
8
w)
9
z)
10
s)
11
(t
12
(v
13
v)
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
14
(u
15
u)
16
t)
13
Ergebnis einer Tiefensuche (2)
y
z
s
t
3/6
2/9
1/10
11/16
F
B
4/5
7/8
C
x
C
C
w
12/13
v
s
B
C
14/15
u
t
B
C
B
F
z
y
C
v
C
u
w
C
x
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
14
Klassifikation von Kanten
Betrachten Graphen G=(V,E) und einen Tiefensuch –
Wald Gπ = (V,E π ) entstanden durch eine Tiefensuche.
1. Kanten in G, die auch in Gπ liegen, heissen
Baumkanten.
2. Kanten (u,v), die eine Knoten u zu einem Knoten
v verbinden, der in Gπ ein Vorfahre von u ist,
heissen Rückkanten.
3. Kanten (u,v), die einen Knoten u zu einem Knoten
v verbinden, der in Gπ ein Nachfahre von u ist,
heissen Vorwärtskanten.
4. Die restlichen Kanten heissen Kreuzungskanten.
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
15
Ergebnis einer Tiefensuche (2)
B:= Rückkante
y
z
s
t
3/6
2/9
1/10
11/16
F:= Vorwärtskante
C:= Kruezungskante
F
B
4/5
7/8
C
x
C
12/13
C
w
v
B
C
14/15
u
Baumkante
s
t
B
C
B
F
z
y
C
v
C
u
w
C
x
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
16
Zusammenhangskomponenten
Definition 15.11: Ein ungerichteter Graph G=(V,E) heisst
zusammenhängend, wenn es für je zwei Knoten u,v
in G einen Pfad in G gibt, der die Knoten miteinander
verbindet.
Definition 15.12: Die Mengen C1,K, Ck ⊆ V heissen die
Zusammenhangskomponenten von G, wenn
1.
2.
SS 2006
Ci ∩ C j = { } und C1 ∪ L ∪ Ck = V
Zwei Knoten u,v in G sind genau durch einen
Pfad in G miteinander verbunden, wenn es
ein j, 1 ≤ j ≤ k , gibt, so dass u, v ∈ C j .
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
17
Zusammenhangskomponenten - Beispiel
a
b
e
g
d
h
i
f
c
Pfad von a nach f
Zusammenhangskomponenten
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
18
Zusammenhangskomponenten - Berechnung
Satz 15.13: Für einen ungerichteten Graphen G=(V,E)
sind die Zusammenhangskomponenten C1,K, Ck
gegeben durch die Knotenmengen der Bäume eines
beliebigen Tiefensuch-Waldes von G.
Korollar 15.14: Die Zusammenhangskomponenten eines
ungerichteten Graphen G können in Zeit O ( V + E )
berechnet werden.
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
19
Starke Zusammenhangskomponenten
Definition 15.15: Ein gerichteter Graph G=(V,E) heisst
stark zusammenhängend, wenn es für je zwei
Knoten u,v in G gerichtete Pfade von u nach v und
von v nach u in G gibt.
Definition 15.16: Die Mengen C1,K, Ck ⊆ V heissen die
starke Zusammenhangskomponenten von G, wenn
1.
2.
SS 2006
Ci ∩ Cj = { } und C1 ∪ L ∪ Ck = V
Für je zwei Knoten u,v existieren genau dann
gerichtete Pfade von u nach v und von v nach
u, wenn es ein j, 1 ≤ j ≤ k , gibt, so dass u, v ∈ Cj .
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
20
Starke Zusammenhangskomponenten - Beispiel
1
2
3
4
5
6
Starke Zusammenhangskomponenten
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
21
Starke Zusammenhangskomponenten - Berechnung
Satz 15.17: Die starken Zusammenhangskomponenten
eines gerichteten Graphen G können in Zeit O ( V + E )
berechnet werden.
SS 2006
Datenstrukturen und Algorithmen
15. Elementare Graphalgorithmen
22
Herunterladen