Algorithmen und Datenstrukturen Kapitel 8 0.2cm Graphen

Werbung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Einführung und Definitionen
Darstellung
Einführung
Algorithmen und Datenstrukturen
Kapitel 8
Graphen sind eine grundlegende Datenstruktur, die in vielen
Bereichen der Informatik (und auch in anderen Bereichen)
Anwendung findet. Man kann ohne Einschränkung zwei Elemente
einer Mengen (den Knoten) in Beziehung setzen (durch eine
Kante).
Graphen
Frank Heitmann
[email protected]
Anmerkung
Erlaubt man verschiedene Kanten-’Typen’, so kann man sogar verschiedene Beziehungen ausdrücken.
2. Dezember 2015
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
1/145
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Einführung und Definitionen
Darstellung
Definitionen
2/145
Einführung und Definitionen
Darstellung
Gewichteter Graph
Definition
Ein Graph ist ein Tupel G = (V , E ) bestehend aus einer Menge V
(auch V (G )) von Knoten oder Ecken und einer Menge E (auch
E (G )) von Kanten.
Ist G ein ungerichteter Graph, so ist
Definition
Bei einem gewichteten Graphen ist neben dem Graph G = (V , E )
(gerichtete oder ungerichtet) noch eine Gewichtsfunktion
w : E → R+ gegeben, die jeder Kante e ∈ E ihre Kosten w (e)
zuweist.
E ⊆ {{v1 , v2 } | v1 , v2 ∈ V , v1 6= v2 },
Anmerkung
Diese Definition ist in der Datenstruktur-Vorlesung nicht explizit
auf den Folien gewesen, ist aber sehr wichtig. (Die meisten Graphen
haben Gewichte (oder Buchstaben o.ä.) an den Kanten.)
ist G ein gerichteter Graph, so ist
E ⊆ V 2.
Ist |E | viel kleiner als |V |2 , so nennt man den Graphen dünn
besetzt. Ist |E | nahe an |V |2 , so spricht man von dicht besetzten
Graphen.
Frank Heitmann [email protected]
3/145
Frank Heitmann [email protected]
4/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Einführung und Definitionen
Darstellung
Definitionen
Einführung und Definitionen
Darstellung
Definitionen
Definition
Ein Weg ist ein nicht leerer Graph P = (V , E ) mit
V = {x0 , x1 , . . . , xk }, E = {x0 x1 , x1 x2 , . . . , xk−1 xk }, wobei die
xi paarweise verschieden sind. x0 und xk sind die Enden von
P, sie sind durch P verbunden. Die Anzahl der Kanten eines
Weges ist seine Länge.
Definition
Sind je zwei Knoten von G mit einer Kante verbunden, so ist
G ein vollständiger Graph. Bei n Knoten: K n .
Eine Menge paarweise nicht benachbarter Knoten nennt man
unabhängig.
Der Grad d(v ) eines Knotens v ist die Anzahl mit v inzidenter
Kanten.
Ist P wie oben ein Weg, so ist P + xk x0 ein Kreis (der Länge
k + 1).
Die Menge der Nachbarn eines Knotens v bezeichnet man mit
N(v ) (hier gilt d(v ) = |N(v )|).
Der Abstand zweier Knoten x und y voneinander wird mit
d(x, y ) bezeichnet und ist die geringste Länge eines
x-y -Weges.
δ(G ) ist der Minimalgrad von G , ∆(G ) der Maximalgrad.
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
5/145
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Einführung und Definitionen
Darstellung
Definitionen
6/145
Einführung und Definitionen
Darstellung
Darstellung von Graphen
Ein Graph G = (V , E ) wird dargestellt indem man seine Knoten
als Punkte und die Tupel oder Mengen aus E als (gerichtete)
Kanten zwischen die Knoten einzeichnet.
Definition
Seien G = (V , E ) und G 0 = (V 0 , E 0 ) Graphen. Gilt V 0 ⊆ V
und E 0 ⊆ E , so nennt man G 0 einen Teilgraphen von G .
Im Computer speichert man einen Graphen meist mittels einer
Adjazenzmatrix oder einer Adjazenzliste. (Man kann die Mengen V
und E aber auch direkt speichern.)
Ist G = (V , E ) ein Graph und V 0 ⊆ V , so nennt man den
Graphen G 0 = (V 0 , E 0 ) mit E 0 = {{v1 , v2 } ∈ E | v1 , v2 ∈ V 0 }
den von V 0 induzierten Graphen.
Anmerkung
Bei Graphen schreibt man (und wir) oft O(V + E ) etc., wenn
O(|V | + |E |) gemeint ist. Man beacht zudem, dass dies die
Komplexität bzgl. der Kenngrößen V und E ausdrückt und nicht
umbedingt die Größe der Eingabe wiederspiegelt!
Frank Heitmann [email protected]
7/145
Frank Heitmann [email protected]
8/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Einführung und Definitionen
Darstellung
Darstellung von Graphen - Adjazenzmatrix
v
v
w x
Darstellung von Graphen - Adjazenzmatrix
y
v
v
w
v
w
x
y
Einführung und Definitionen
Darstellung
v
w
x
y
y
y
0
0
w
x
w x
0
x
0
y
V
= {v , w , x, y }
V
= {v , w , x, y }
E
= {{v , w }, {v , x}, {v , y }, {w , x}, {x, y }}
E
= {{v , w }, {v , x}, {v , y }, {w , x}, {x, y }}
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
9/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Einführung und Definitionen
Darstellung
Darstellung von Graphen - Adjazenzmatrix
v
v
v
w
w
x
y
Frank Heitmann [email protected]
w x
y
v
v
1 0
1
y
1
Einführung und Definitionen
Darstellung
Darstellung von Graphen - Adjazenzmatrix
0 1 1 1
x
10/145
w
x
0
y
0
w x
y
v
0 1 1 1
w
1 0 1 0
x
1 1 0 1
y
1 0 1 0
V
= {v , w , x, y }
V
= {v , w , x, y }
E
= {{v , w }, {v , x}, {v , y }, {w , x}, {x, y }}
E
= {{v , w }, {v , x}, {v , y }, {w , x}, {x, y }}
Frank Heitmann [email protected]
11/145
Frank Heitmann [email protected]
12/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Einführung und Definitionen
Darstellung
Darstellung von Graphen - Adjazenzmatrix
v
w
v
x
y
w x
Darstellung von Graphen - Adjazenzlisten
y
v
0 1 1 1
w
1 0 1 0
x
y
Einführung und Definitionen
Darstellung
1 1 0 1
v
w
v
w
x
1 0 1 0
y
x
y
Bei einer Adjazenzmatrix hat man eine n × n-Matrix, bei der an
der Stelle (i, j) genau dann eine 1 steht, wenn vi und vj verbunden
sind.
Der Speicherplatzbedarf ist in Θ(V 2 ) (unabhängig von der
Kantenzahl).
Frank Heitmann [email protected]
13/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
v
v
w
x
x
y
v
w
x
x
y
y
Frank Heitmann [email protected]
Einführung und Definitionen
Darstellung
Darstellung von Graphen - Adjazenzlisten
w
y
14/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Einführung und Definitionen
Darstellung
Darstellung von Graphen - Adjazenzlisten
w
Frank Heitmann [email protected]
v
w
x
w
v
x
y
x
y
15/145
Frank Heitmann [email protected]
16/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Einführung und Definitionen
Darstellung
Darstellung von Graphen - Adjazenzlisten
Darstellung von Graphen - Adjazenzlisten
v
v
v
w
w
x
x
v
x
y
v
y
v
x
y
v
w
x
w
x
v
x
y
v
y
v
x
w
x
y
y
w
x
Einführung und Definitionen
Darstellung
y
w
w
Bei der Adjazenzlistendarstellung haben wir ein Array von |V |
Listen, für jeden Knoten eine. Die Adjazenzliste Adj[v ] zu einem
Knoten v enthält alle Knoten, die mit v adjazent sind.
Bei einem gerichteten Graphen ist die Summe aller Adjazenzlisten
|E |, bei einem ungerichteten Graphen |2E |. Der
Speicherplatzbedarf ist folglich Θ(V + E ).
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
17/145
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Einführung und Definitionen
Darstellung
Darstellung von Graphen - Zusammenfassung
18/145
Breitensuche
Tiefensuche
Zusammenfassung
Die Struktur eines Graphen
Adjazenzmatrix: |V | × |V |-Matrix A = (aij ) mit aij = 1 falls
(i, j) ∈ E und 0 sonst. Größe in Θ(V 2 ).
Wir wollen nun etwas grundlegendes über die Struktur eines
gegebenen Graphen erfahren. Hierzu ist es zunächst praktisch
Algorithmen zu haben, die den Graphen durchwandern, d.h. in
systematischer Weise die Kanten entlangwandern und die Knoten
besuchen. Oft ist es auch nützlich einen Spannbaum zu ermitteln.
Adjazenzliste: Liste Adj[v ] für jeden Knoten v ∈ V in der die
Knoten, die mit v adjazent sind gespeichert sind. Größe in
Θ(V + E ).
Bei einer Adjazenzmatrix kann man schnell herausfinden, ob
zwei Knoten benachbart sind oder nicht. Dafür ist es
langsamer alle Knoten zu bestimmen, die mit einem Knoten
benachbart sind. (Bei Adjazenzlisten genau andersherum.)
Definition
Ein Spannbaum ist ein Teilgraph T eines Graphen G , wobei T ein
Baum ist und alle Knoten von G enthält.
Beide Darstellungen sind ineinander transformierbar.
Beide Darstellungen sind leicht auf den Fall eines gewichteten
Graphen anpassbar.
Frank Heitmann [email protected]
19/145
Frank Heitmann [email protected]
20/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breiten- und Tiefensuche
Breitensuche - Die Idee
Gegeben ein Graph G und ein Startknoten s ’entdeckt’ die
Breitensuche alle Knoten, die von s aus erreichbar sind. Zudem
wird der Abstand (in Kanten) von s aus berechnet (tatsächlich
wird sogar der kürzeste Abstand ermittelt).
Die Breiten- und Tiefensuche in einem Graphen erreichen (im
Prinzip) beide Ziele! Es wird zwar i.A. nicht der minimale
Spannbaum ermittelt, doch dazu später mehr.
Breiten- und Tiefensuche sind oft ’Urtypen’ für weitere
Graphalgorithmen entweder
Man kann auch zusätzlich einen ’Breitensuchbaum’ (mit Wurzel s)
und damit die kürzesten Pfade von s zu den anderen Knoten
ermitteln.
als wichtige Subroutine oder
Der Algorithmus entdeckt zunächst die Knoten mit Entfernung k
und dann die mit Entfernung k + 1, daher der Name. Er geht erst
in die Breite...
als ’Ideengeber’
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
21/145
Breitensuche
Tiefensuche
Zusammenfassung
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - Die Idee
22/145
Breitensuche
Tiefensuche
Zusammenfassung
Zur Nachbereitung
Starte mit Knoten s in einer Queue Q.
Wiederhole solange Q nicht leer...
Anmerkung (zur Nachbereitung)
Im nachfolgenden Beispiel ist für einen Knoten v jeweils sein linkes
Kind der erste Knoten in v ’s Adjazenzliste, sein rechtes Kind der
zweite Knoten in der Adjazenzliste. (Dies ist wichtig, um zu
verstehen in welcher Reihenfolge die Knoten in der Queue
gespeichert werden.)
Für das Beispiel ist es ferner unerheblich, ob die Kanten gerichtet
oder ungerichtet sind. Bei ungerichteten Kanten wäre auch stets
noch der Vater in der Adjazenzliste eines Knotens. Dieser wäre
jedoch bereits gefärbt und würde nicht wieder in der Queue
gespeichert werden.
Nimm vordersten Knoten v aus Q.
(Bearbeite diesen und Färbe diesen so, dass er nicht wieder
besucht wird.)
Tue alle Nachbarn von v , die bisher nicht besucht wurden in
die Queue.
Anmerkung
Durch die Queue wird sichergestellt, dass die Knoten ’in der Breite’
besucht werden, d.h. zunächst werden die Knoten mit Entfernung
k von s entdeckt und erst danach jene mit Entfernung k + 1.
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
23/145
Frank Heitmann [email protected]
24/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Baum
Breitensuche - im Baum
10
10
6
14
3
2
8
5
7
12
9
6
15
16
13
2
A:
A:
Frank Heitmann [email protected]
25/145
8
5
Q: 10
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
14
3
Q:
7
12
9
Breitensuche
Tiefensuche
Zusammenfassung
10
14
8
7
26/145
Breitensuche - im Baum
6
5
16
13
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
10
2
15
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - im Baum
3
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
13
3
16
2
8
5
Q:
Q: 6 14
A:
A:
Frank Heitmann [email protected]
14
27/145
7
12
9
Frank Heitmann [email protected]
15
13
16
28/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Baum
Breitensuche - im Baum
10
10
6
14
3
2
8
5
7
12
9
6
15
16
13
2
A: 10
A: 10
Frank Heitmann [email protected]
29/145
8
5
Q: 14
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
14
3
Q: 6 14
7
12
9
Breitensuche
Tiefensuche
Zusammenfassung
10
14
8
7
30/145
Breitensuche - im Baum
6
5
16
13
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
10
2
15
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - im Baum
3
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
13
3
16
2
8
5
Q: 14 3 8
Q: 14 3 8
A: 10
A: 10 6
Frank Heitmann [email protected]
14
31/145
7
12
9
Frank Heitmann [email protected]
15
13
16
32/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Baum
Breitensuche - im Baum
10
10
6
14
3
2
8
5
7
12
9
6
15
3
16
13
14
2
8
5
7
Q: 3 8
Q: 3 8 12 15
A: 10 6
A: 10 6
Frank Heitmann [email protected]
33/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
12
9
Breitensuche
Tiefensuche
Zusammenfassung
10
14
8
7
34/145
Breitensuche - im Baum
6
5
16
13
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
10
2
15
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - im Baum
3
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
13
3
16
2
8
5
Q: 3 8 12 15
Q: 8 12 15
A: 10 6 14
A: 10 6 14
Frank Heitmann [email protected]
14
35/145
7
12
9
Frank Heitmann [email protected]
15
13
16
36/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Baum
Breitensuche - im Baum
10
10
6
14
3
2
8
5
7
12
9
6
15
3
16
13
14
2
8
5
7
Q: 8 12 15 2 5
A: 10 6 14
A: 10 6 14 3
Frank Heitmann [email protected]
37/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
12
9
Q: 8 12 15 2 5
Breitensuche
Tiefensuche
Zusammenfassung
10
14
8
7
38/145
Breitensuche - im Baum
6
5
16
13
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
10
2
15
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - im Baum
3
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
13
14
3
16
2
8
5
7
12
9
Q: 12 15 2 5
Q: 12 15 2 5 7 9
A: 10 6 14 3
A: 10 6 14 3
Frank Heitmann [email protected]
39/145
Frank Heitmann [email protected]
15
13
16
40/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Baum
Breitensuche - im Baum
10
10
6
14
3
2
8
5
7
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
3
16
13
14
2
8
5
7
12
9
Q: 2 5 7 9 13 16
A: 10 6 14 3 8
A: 10 6 14 3 8 12 15
41/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
10
6
2
14
8
5
7
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - im Baum
10
3
42/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Baum
16
13
Q: 12 15 2 5 7 9
Frank Heitmann [email protected]
15
12
9
6
15
13
14
3
16
2
8
5
7
12
9
Q: 5 7 9 13 16
Q: 5 7 9 13 16
A: 10 6 14 3 8 12 15
A: 10 6 14 3 8 12 15 2
Frank Heitmann [email protected]
43/145
Frank Heitmann [email protected]
15
13
16
44/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Baum
Breitensuche - Kernidee als Algorithmus
10
6
2
8
5
Algorithmus 1 BFS(G , s)
1: farbe[s] = pink
2: Q = ∅, enqueue(Q, s)
3: while Q 6= ∅ do
4:
u = dequeue(Q)
5:
for each v ∈ Adj[u] do
6:
if farbe[v ] == weiss then
7:
farbe[v ] = pink
8:
enqueue(Q, v )
9:
end if
10:
end for
11:
farbe[u] = schwarz
12: end while
14
3
7
Breitensuche
Tiefensuche
Zusammenfassung
12
9
15
13
16
Q:
A: 10 6 14 3 8 12 15 2 5 7 9 13 16
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
45/145
Breitensuche
Tiefensuche
Zusammenfassung
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Zur Nachbereitung
46/145
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - im Graphen
2
10
Anmerkung (zur Nachbereitung)
Wir verzichten für das nächste Beispiel auf die Angabe der
einzelnen Adjazenzlisten. Man kann sie aus dem Beispiel ablesen.
Man beachte noch, dass je nachdem wie die Knoten in der
Adjazenzliste angeordnet sind, der Algorithmus verschiedene
Ergebnisse liefern kann. Wären die Knoten 7 und 9 bspw. in der
Adjazenzliste der 8 in umgekehrter Reihenfolge, so würde zuerst
die 9 abgearbeitet werden, bevor man bei 7 und 5 weiter im Baum
hinabsteigt. (Bei der Tiefensuche später ist dieser Unterschied
noch merklicher.)
6
3
s
7
5
9
8
A:
Q:
Frank Heitmann [email protected]
47/145
Frank Heitmann [email protected]
48/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Graphen
Breitensuche - im Graphen
2
10
s
5
A: 6
A: 6
Q: 2 3 8
Q: 3 8
49/145
Breitensuche
Tiefensuche
Zusammenfassung
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Graphen
2
Breitensuche
Tiefensuche
Zusammenfassung
s
9
6
3
7
5
2
10
6
5
8
9
A: 6 2 3
Q: 3 8 10
Q: 8 10
51/145
s
7
A: 6 2
Frank Heitmann [email protected]
50/145
Breitensuche - im Graphen
10
3
8
9
Frank Heitmann [email protected]
s
7
5
8
9
6
3
7
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
2
10
6
3
Breitensuche
Tiefensuche
Zusammenfassung
Frank Heitmann [email protected]
8
52/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Graphen
Breitensuche - im Graphen
2
10
2
10
6
3
Breitensuche
Tiefensuche
Zusammenfassung
s
3
7
5
9
A: 6 2 3 8 10
A: 6 2 3 8 10 7
Q: 7 9
Q: 9 5
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
53/145
Breitensuche
Tiefensuche
Zusammenfassung
54/145
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - mehr Informationen
2
10
6
3
8
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - im Graphen
s
7
5
8
9
6
s
Reichern wir die Breitensuche etwas an, so können wir mehr
Informationen gewinnen, z.B. den Abstand der einzelnen Knoten
von s und den Breitensuchbaum.
7
5
9
8
Der folgende Algorithmus ist wie im [Cormen].
A: 6 2 3 8 10 7 9 5
Q:
Frank Heitmann [email protected]
55/145
Frank Heitmann [email protected]
56/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - Initialisierung
Breitensuche - Hauptschleife
Algorithmus 2 BFS(G , s) - Teil 1, Initphase
1: for each u ∈ V (G ) \ {s} do
2:
farbe[u] = weiss, d[u] = ∞, π[u] = nil
3: end for
4: farbe[s] = grau
5: d[s] = 0, π[s] = nil
6: Q = ∅, enqueue(Q, s)
Algorithmus 3 BFS(G , s) - Teil 2, Hauptteil
1: while Q 6= ∅ do
2:
u = dequeue(Q)
3:
for each v ∈ Adj[u] do
4:
if farbe[v ] == weiss then
5:
farbe[v ] = grau
6:
d[v ] = d[u] + 1, π[v ] = u
7:
enqueue(Q, v )
8:
end if
9:
end for
10:
farbe[u] = schwarz
11: end while
Anmerkung
Farben: weiss heißt ’noch nicht besucht’, grau ’besucht, aber noch
unbesuchte Nachbarn’, schwarz ’besucht, alle Nachbarn entdeckt’.
d[u] ist die Anzahl der Schritt von s zu u, π[u] der Vorgänger von
u auf diesem Pfad.
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
57/145
Breitensuche
Tiefensuche
Zusammenfassung
Frank Heitmann [email protected]
58/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Zur Nachbereitung
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - Beispiel
b
Anmerkung (zur Nachbereitung)
Für das nachfolgende Beispiel verzichten wir erneut auf die Angabe
der Adjazenzlisten.
Die Zahl in einem Knoten v ist nun nicht mehr der Schlüssel o.ä.,
sondern der Wert von d[v ]. Die Farbe ’grün’ in den Bildern
entspricht der Farbe ’schwarz’ im Quellcode (d.h. ein grüner
Knoten ist vollständig abgearbeitet und alle seine Kinder sind
’entdeckt’ (also mindestens ’grau’)).
Die dicken Kanten stellen die Baumkanten dar, die mittels der π
Funktion gewonnen werden können, die jeden Knoten auf seinen
Vorgänger im Baum abbildet.
Frank Heitmann [email protected]
a
s
d
c
e
f
g
Q:
59/145
Frank Heitmann [email protected]
60/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - Beispiel
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - Beispiel
b
b
a
a
s
0
d
1
c
e
s
c
0
d
1
e
f
f
g
g
Q: a c
Q: s
Frank Heitmann [email protected]
61/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Frank Heitmann [email protected]
62/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - Beispiel
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - Beispiel
b
2
a
1
s
1
1
e
s
g
Q: c b e
c
0
2
d
f
g
Frank Heitmann [email protected]
2
a
c
0
2
d
b
1
e
f
2
Q: b e f
63/145
Frank Heitmann [email protected]
64/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - Beispiel
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - Beispiel
b
b
2
a
s
1
2
d
s
1
c
0
2
a
1
e
3
d
f
g
2
2
65/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
2
66/145
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - Beispiel
b
b
2
a
s
2
g
3
2
a
s
1
c
0
e
d
f
c
0
1
3
2
g
2
3
Q: d g
Frank Heitmann [email protected]
f
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - Beispiel
3
e
Q: f d
Frank Heitmann [email protected]
d
1
g
Q: e f
1
c
0
1
e
f
2
Q: g
67/145
Frank Heitmann [email protected]
68/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - Beispiel
Analyse (Laufzeit)
Zu Anfang ist jeder Knoten weiß. Der Test in der Schleife
stellt daher sicher, dass jeder Knoten nur einmal in die Queue
eingefügt und aus ihr entnommen wird.
Für die Warteschlangenoperationen brauchen wir also O(V ).
Die Adjazenzliste jedes Knotens wird nur einmal geprüft
(wenn der Knoten aus der Queue entnommen wird).
Die Summe aller Adjazenzlisten ist in Θ(E ), folglich benötigt
das Prüfen der Adjazenzlisten O(E ).
Initialisierung geht auch in O(V ).
Insgesamt ergibt sich so: O(V + E ), was linear in der Größe
der Adjazenzliste ist.
b
2
a
s
1
d
c
0
3
2
1
e
f
g
2
3
Anmerkung
Diese Laufzeitanalyse stimmt nur, wenn der Graph durch
Adjazenzlisten gegeben ist!
Q:
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
69/145
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Analyse (Korrektheit)
70/145
Breitensuche
Tiefensuche
Zusammenfassung
Breitensuche - Ergebnis
Die Korrektheit kann man mittels einer Schleifeninvarianten zeigen,
die besagt, dass die Queue aus der Menge der grauen Knoten
besteht.
Zur Betonung:
Satz
In einem ungewichteten Graphen (bzw. einem Graph in dem jede
Kante das Gewicht 1 hat) ermittelt der BFS-Algorithmus für jeden
Knoten v den kürzesten Abstand zu s sowie einen kürzesten Pfad
von s zu v (den man erhält indem man den π[v ] rückwärts folgt).
Der Algorithmus läuft in O(V + E ), wenn der Graph als
Adjazenzliste gegeben ist.
Alternativ kann man mit mehreren Lemmata zeigen, dass die
ermittelten Abstände tatsächlich die kürzesten sind und ein Baum
entsteht. Man erhält so (siehe [Cormen], dort ca. 3 Seiten):
Satz
Gegeben G = (V , E ) (gerichtet oder ungerichtet) und s ∈ V . BFS
ermittelt jeden von s aus erreichbaren Knoten v . Bei Terminierung
gilt d[v ] = δ(s, v ) für alle v . Zudem ist für jeden von s aus
erreichbaren Knoten v (v 6= s) einer der kürzesten Pfade von s
nach v ein kürzester Pfad von s nach π[v ] gefolgt von der Kante
(π[v ], v ).
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
Wichtige Anmerkung
Beweis umbedingt mal im [Cormen] nachlesen!
71/145
Frank Heitmann [email protected]
72/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Die Idee
Tiefensuche - Die Idee
Starte mit Knoten s in einem Stack S.
Wiederhole solange S nicht leer...
Bei der Tiefensuche geht man einfach immer weiter noch
ungeprüfte Kanten entlang, so lange dies möglich ist. Man folgt
also ’einem Pfad’ so lange es möglich ist. Erst wenn man einen
Knoten erreicht von dem aus man nur bereits besuchte Knoten
erreichen kann, geht man einen Schritt zurück.
Nimm obersten Knoten v aus S.
(Bearbeite diesen und Färbe diesen so, dass er nicht wieder
besucht wird.)
Tue alle Nachbarn von v , die bisher nicht besucht wurden auf
den Stack.
Bleiben unentdeckte Knoten übrig wählt man diese als neue
Startknoten. So kann sich (bei einem unzusammenhängenden
Graphen) ein Tiefensuchwald ergeben. (Die Breitensuche kann man
auch so anpassen, aber typischerweise werden die Algorithmen so
benutzt.)
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Anmerkung
Durch den Stack wird sichergestellt, dass die Knoten ’in der Tiefe’
besucht werden, d.h. dass man zunächst von einem Knoten aus
immer weiter ’in die Tiefe’ geht, bevor man zurück geht und eine
andere ’Abzweigung’ nimmt.
73/145
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
74/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Zur Nachbereitung
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - im Baum
10
Anmerkung (zur Nachbereitung)
Wie bei der Breitensuche ist im nachfolgenden Beispiel für einen
Knoten v jeweils sein linkes Kind der erste Knoten in v ’s
Adjazenzliste, sein rechtes Kind der zweite Knoten in der
Adjazenzliste. Mit einer Ausnahme: Beim Knoten 10 ist dies
genau umgekehrt. Darum ist der Stack im vierten Bild mit 6, 14
gefüllt.
Für das Beispiel ist es wieder unerheblich, ob die Kanten gerichtet
oder ungerichtet sind. Bei ungerichteten Kanten wäre auch stets
noch der Vater in der Adjazenzliste eines Knotens. Dieser wäre
jedoch bereits gefärbt und würde nicht wieder im Stack
gespeichert werden.
6
14
3
2
8
5
7
12
9
15
13
16
S:
A:
Frank Heitmann [email protected]
75/145
Frank Heitmann [email protected]
76/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - im Baum
Tiefensuche - im Baum
10
10
6
14
3
2
8
5
7
12
9
6
15
16
13
2
S:
A:
A:
Frank Heitmann [email protected]
77/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
14
3
S: 10
8
5
7
12
9
Breitensuche
Tiefensuche
Zusammenfassung
10
14
8
7
78/145
Tiefensuche - im Baum
6
5
16
13
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
10
2
15
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - im Baum
3
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
13
3
16
2
8
5
S: 6 14
S: 6 14
A:
A: 10
Frank Heitmann [email protected]
14
79/145
7
12
9
Frank Heitmann [email protected]
15
13
16
80/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - im Baum
Tiefensuche - im Baum
10
10
6
14
3
2
8
5
7
12
9
6
15
16
13
2
8
5
7
S: 8 3 14
A: 10
A: 10
Frank Heitmann [email protected]
81/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
14
3
S: 14
12
9
Breitensuche
Tiefensuche
Zusammenfassung
10
14
8
7
82/145
Tiefensuche - im Baum
6
5
16
13
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
10
2
15
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - im Baum
3
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
13
3
16
2
8
5
S: 8 3 14
S: 3 14
A: 10 6
A: 10 6
Frank Heitmann [email protected]
14
83/145
7
12
9
Frank Heitmann [email protected]
15
13
16
84/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - im Baum
Tiefensuche - im Baum
10
10
6
14
3
2
8
5
7
12
9
6
15
3
16
13
14
2
8
5
7
S: 9 7 3 14
S: 9 7 3 14
A: 10 6
A: 10 6 8
Frank Heitmann [email protected]
85/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
12
9
Breitensuche
Tiefensuche
Zusammenfassung
10
14
8
7
86/145
Tiefensuche - im Baum
6
5
16
13
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
10
2
15
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - im Baum
3
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
13
14
3
16
2
8
5
7
S: 7 3 14
S: 7 3 14
A: 10 6 8
A: 10 6 8 9
Frank Heitmann [email protected]
87/145
12
9
Frank Heitmann [email protected]
15
13
16
88/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - im Baum
Tiefensuche - im Baum
10
10
6
14
3
2
8
5
7
12
9
6
15
3
16
13
14
2
8
5
7
S: 3 14
A: 10 6 8 9
A: 10 6 8 9 7
Frank Heitmann [email protected]
89/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
12
9
S: 3 14
Breitensuche
Tiefensuche
Zusammenfassung
10
14
8
7
90/145
Tiefensuche - im Baum
6
5
16
13
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
10
2
15
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - im Baum
3
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
13
14
3
16
2
8
5
7
S: 14
S: 5 2 14
A: 10 6 8 9 7
A: 10 6 8 9 7
Frank Heitmann [email protected]
91/145
12
9
Frank Heitmann [email protected]
15
13
16
92/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - im Baum
Tiefensuche - im Baum
10
10
6
14
3
2
8
5
7
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
3
16
13
14
2
8
5
7
12
9
S: 14
A: 10 6 8 9 7 3
A: 10 6 8 9 7 3 5 2
93/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Frank Heitmann [email protected]
Breitensuche
Tiefensuche
Zusammenfassung
10
6
2
14
8
5
7
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - im Baum
10
3
94/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - im Baum
16
13
S: 5 2 14
Frank Heitmann [email protected]
15
12
9
6
15
13
14
3
16
2
8
5
7
12
9
S:
S: 15 12
A: 10 6 8 9 7 3 5 2
A: 10 6 8 9 7 3 5 2
Frank Heitmann [email protected]
95/145
Frank Heitmann [email protected]
15
13
16
96/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - im Baum
Tiefensuche - im Baum
10
10
6
14
3
2
8
5
7
Breitensuche
Tiefensuche
Zusammenfassung
12
9
6
15
13
14
3
16
2
8
5
7
12
9
15
13
16
S: 15 12
S:
A: 10 6 8 9 7 3 5 2 14
A: 10 6 8 9 7 3 5 2 14 15 16 12 13
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
97/145
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Idee
98/145
Breitensuche
Tiefensuche
Zusammenfassung
Tiefen- vs. Breitensuche
Algorithmus 4 DFS(G , s)
1: farbe[s] = pink
2: S = ∅, push(S, s)
3: while S 6= ∅ do
4:
u = pop(S)
5:
for each v ∈ Adj[u] do
6:
if farbe[v ] == weiss then
7:
farbe[v ] = pink
8:
push(S, v )
9:
end if
10:
end for
11:
farbe[u] = schwarz
12: end while
Frank Heitmann [email protected]
Frank Heitmann [email protected]
Beobachtung
Der einzige Unterschied zur Breitensuche ist die Benutzung eines
Stacks statt einer Queue!
99/145
Frank Heitmann [email protected]
100/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Zur Nachbereitung
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - im Graphen
2
10
Anmerkung (zur Nachbereitung)
6
3
Wie bei der Breitensuche verzichten wir auch im nachfolgenden
Beispiel auf die Angabe der Adjazenzlisten.
s
7
5
8
9
A:
S:
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
101/145
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - im Graphen
2
Breitensuche
Tiefensuche
Zusammenfassung
s
9
6
3
7
5
2
10
6
5
8
9
A: 6 8
S: 3 2
S: 9 7 3 2
103/145
s
7
A: 6
Frank Heitmann [email protected]
102/145
Tiefensuche - im Graphen
10
3
Frank Heitmann [email protected]
Frank Heitmann [email protected]
8
104/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - im Graphen
Tiefensuche - im Graphen
2
10
2
10
6
3
Breitensuche
Tiefensuche
Zusammenfassung
s
3
7
5
A: 6 8 9
A: 6 8 9 7 5
S: 3 2
S: 3 2
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
105/145
Breitensuche
Tiefensuche
Zusammenfassung
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - im Graphen
106/145
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - im Graphen
2
10
s
9
6
3
7
5
2
10
6
3
8
9
Frank Heitmann [email protected]
s
7
5
8
9
6
7
5
8
s
9
8
A: 6 8 9 7 5
A: 6 8 9 7 5 3 10 2
S: 2
S:
Frank Heitmann [email protected]
107/145
Frank Heitmann [email protected]
108/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - mehr Informationen
Breitensuche
Tiefensuche
Zusammenfassung
Tiefenensuche - Initialisierung
Reichern wir nun die Tiefensuche etwas an, so können wir mehr
Informationen gewinnen, was insb. später nützlich wird. (Der
folgende Algorithmus ist wieder wie im [Cormen].)
Algorithmus 5 DFS(G ) - Initphase und Aufruf
1: for each u ∈ V (G ) do
2:
farbe[u] = weiss, π[u] = nil
3: end for
4: zeit = 0
5: for each u ∈ V (G ) do
6:
if farbe[u] == weiss then
7:
DFS VISIT(u)
8:
end if
9: end for
Anmerkung
Farben: weiss heißt ’noch nicht besucht’, grau ’besucht, aber
noch unbesuchte Nachbarn’, schwarz ’besucht, alle Nachbarn
verarbeitet’.
d[u] ist ’discovery’ Zeit, f [u] ist ’finished’ Zeit. (Beachte:
Immer wenn d[u] oder f [u] gesetzt werden, wird vorher die
Zeit erhöht!)
π[u] ist der Vorgänger von u in diesem Tiefensuchbaum.
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
109/145
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Hauptroutine
110/145
Breitensuche
Tiefensuche
Zusammenfassung
Zur Nachbereitung
Algorithmus 6 DFS VISIT(u) - Teil 2, Hauptteil
1: farbe[u] = grau
2: zeit = zeit + 1
3: d[u] = zeit
4: for each v ∈ Adj[u] do
5:
if farbe[v ] == weiss then
6:
π[v ] = u
7:
DFS VISIT(v )
8:
end if
9: end for
10: farbe[u] = schwarz
11: zeit = zeit + 1
12: f [u] = zeit
Frank Heitmann [email protected]
Frank Heitmann [email protected]
Anmerkung (zur Nachbereitung)
Für das nachfolgende Beispiel verzichten wir erneut auf die Angabe
der Adjazenzlisten.
Die Zahlen x/y in einem Knoten v sind die Werte d[v ](= x) und
f [v ](= y ). Die Farbe ’grün’ in den Bildern entspricht wieder der
Farbe ’schwarz’ im Quellcode, dicke Kanten stellen wieder
Baumkanten dar. Die gestrichelten Kanten, sind entdecke Kanten,
die als Rückwärtskanten (B) oder Querkanten (C) klassifiziert
worden. Ferner gibt es Vorwärtskanten, die im Beispiel aber nicht
auftreten. Eine Kante von s zu b wäre bei ansonsten gleichen
Ablauf (d.h. wenn zuerst die Kante (s, a) gewählt wird) eine
Vorwärtskante.
111/145
Frank Heitmann [email protected]
112/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Beispiel
Tiefensuche - Beispiel
b
a
d
Breitensuche
Tiefensuche
Zusammenfassung
b
s
a
c
1/
e
d
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
113/145
Breitensuche
Tiefensuche
Zusammenfassung
c
e
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Beispiel
s
114/145
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - Beispiel
b
b
3/
a
2/
d
1/
s
a
c
2/
e
Frank Heitmann [email protected]
d
115/145
1/
s
c
e
Frank Heitmann [email protected]
116/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Beispiel
Tiefensuche - Beispiel
b
b
3/
3/4
B
a
2/
d
s
1/
c
2/
e
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
B
a
d
Frank Heitmann [email protected]
117/145
Breitensuche
Tiefensuche
Zusammenfassung
s
1/
c
e
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Beispiel
118/145
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - Beispiel
b
b
3/4
3/4
B
a
2/5
d
Breitensuche
Tiefensuche
Zusammenfassung
1/
s
c
2/5
e
Frank Heitmann [email protected]
B
a
d
119/145
1/
s
6/
c
e
Frank Heitmann [email protected]
120/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Beispiel
Tiefensuche - Beispiel
b
b
3/4
3/4
C
B
a
2/5
d
s
1/
6/
c
2/5
e
d
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
121/145
Breitensuche
Tiefensuche
Zusammenfassung
s
1/
6/7
c
e
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Beispiel
C
B
a
Frank Heitmann [email protected]
122/145
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - Beispiel
b
b
3/4
3/4
C
B
a
2/5
d
Breitensuche
Tiefensuche
Zusammenfassung
1/8
s
6/7
c
2/5
e
d
C
B
a
1/8
s
6/7
c
e
9/
Frank Heitmann [email protected]
123/145
Frank Heitmann [email protected]
124/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Beispiel
Tiefensuche - Beispiel
b
b
3/4
3/4
C
B
a
2/5
1/8
d
s
6/7
c
2/5
125/145
Breitensuche
Tiefensuche
Zusammenfassung
Frank Heitmann [email protected]
126/145
Breitensuche
Tiefensuche
Zusammenfassung
b
b
3/4
3/4
C
B
2/5
1/8
s
6/7
c
C
B
a
2/5
C
10/11
c
Tiefensuche - Beispiel
a
d
6/7
9/
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Beispiel
s
e
10/11
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
1/8
d
9/
C
B
a
e
10/
Breitensuche
Tiefensuche
Zusammenfassung
1/8
s
6/7
c
C
e
d
9/
Frank Heitmann [email protected]
10/11
127/145
e
9/12
Frank Heitmann [email protected]
128/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche
Tiefensuche
Zusammenfassung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Besondere Kanten
Breitensuche
Tiefensuche
Zusammenfassung
Tiefensuche - Besondere Kanten
Dabei ist
Man kann bei der Tiefensuche die Kanten klassifizieren je
nachdem, welche Farbe der Knoten v bei einer Kanten (u, v ) hat
(u ist der Knoten der gerade bearbeitet wird, v ist in Adj[u]):
Baumkante. Kanten, die zum Baum gehören. v wurde bei der
Sondierung der Kante (u, v ) entdeckt (erstmalig besucht).
Rückwärtskante. Kante (u, v ), die u mit einem Vorfahren v
im Tiefensuchbaum verbindet.
Vorwärtskante. (Nicht-Baum-)Kante (u, v ), die u mit einem
Nachfahre in v im Tiefensuchbaum verbindet.
Querkanten. Die übrigen Kanten. Im gleichen
Tiefensuchbaum, wenn der eine Knoten nicht Vorfahre des
anderen ist oder zwischen zwei Knoten verschiedener
Tiefensuchbäume (im Wald).
farbe[v ] = weiss: Baumkante.
farbe[v ] = grau: Rückwärtskante.
farbe[v ] = schwarz: Vorwärts- oder Querkante.
Vorwärtskante, falls d[u] < d[v ].
Querkante, falls d[u] > d[v ].
Anmerkung (zur Nachbereitung)
Anmerkung
Bei einem ungerichteten Graphen gibt es nur Baum- und
Rückwärtskanten.
Im Beispiel eben ist dies bereits geschehen!
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
129/145
Breitensuche
Tiefensuche
Zusammenfassung
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Analyse
130/145
Breitensuche
Tiefensuche
Zusammenfassung
Breiten- und Tiefensuche - Zusammenfassung
Zusammenfassung
Breitensuche nutzt eine Queue, Tiefensuche einen Stack. (Die
Tiefensuche wie im [Cormen] kommt ohne Stack aus, arbeitet
dafür aber rekursiv und mit Zeitstempeln.)
Satz
Die Tiefensuche ist korrekt und ihre Laufzeit ist wieder in
O(V + E ).
Beide Operationen laufen in Θ(V + E ), wenn der Graph
mittels Adjazenzlisten gegeben ist.
Die Breitensuche hat (meist) nur einen Startknoten. Sie wird
oft verwendet, um kürzeste Abstände und den
Vorgängerteilgraphen zu ermitteln.
Die Tiefensuche ermittelt einen Tiefensuchwald (mehrere
Startknoten). Sie wird oft als Unterroutine in anderen
Algorithmen verwendet.
Frank Heitmann [email protected]
131/145
Frank Heitmann [email protected]
132/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Problemstellung
Problemstellung
... oder beim Ermitteln der Zusammenhangskomponenten eines
Graphen.
Die Tiefensuche wird z.B. beim topologischen Sortieren benutzt...
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
133/145
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Problemstellung
134/145
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Darstellung von Graphen - Zusammenfassung
Adjazenzmatrix: |V | × |V |-Matrix A = (aij ) mit aij = 1 falls
(i, j) ∈ E und 0 sonst. Größe in Θ(V 2 ).
Adjazenzliste: Liste Adj[v ] für jeden Knoten v ∈ V in der die
Knoten, die mit v adjazent sind gespeichert sind. Größe in
Θ(V + E ).
Zu beidem gleich mehr...
Bei einer Adjazenzmatrix kann man schnell herausfinden, ob
zwei Knoten benachbart sind oder nicht. Dafür ist es
langsamer alle Knoten zu bestimmen, die mit einem Knoten
benachbart sind. (Bei Adjazenzlisten genau andersherum.)
Beide Darstellungen sind ineinander transformierbar.
Beide Darstellungen sind leicht auf den Fall eines gewichteten
Graphen anpassbar.
Frank Heitmann [email protected]
135/145
Frank Heitmann [email protected]
136/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Darstellung von Graphen - Adjazenzmatrix
v
v
w
x
y
w x
Darstellung von Graphen - Adjazenzlisten
y
v
0 1 1 1
w
1 0 1 0
x
1 1 0 1
y
1 0 1 0
v
x
w
x
v
x
y
v
y
v
x
y
w
Bei der Adjazenzlistendarstellung haben wir ein Array von |V |
Listen, für jeden Knoten eine. Die Adjazenzliste Adj[v ] zu einem
Knoten v enthält alle Knoten, die mit v adjazent sind.
Bei einem gerichteten Graphen ist die Summe aller Adjazenzlisten
|E |, bei einem ungerichteten Graphen |2E |. Der
Speicherplatzbedarf ist folglich Θ(V + E ).
137/145
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breitensuche - Die Idee
138/145
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Breitensuche - Die Idee
Starte mit Knoten s in einer Queue Q.
Wiederhole solange Q nicht leer...
Gegeben ein Graph G und ein Startknoten s ’entdeckt’ die
Breitensuche alle Knoten, die von s aus erreichbar sind. Zudem
wird der Abstand (in Kanten) von s aus berechnet (tatsächlich
wird sogar der kürzeste Abstand ermittelt).
Nimm vordersten Knoten v aus Q.
(Bearbeite diesen und Färbe diesen so, dass er nicht wieder
besucht wird.)
Tue alle Nachbarn von v , die bisher nicht besucht wurden in
die Queue.
Man kann auch zusätzlich einen ’Breitensuchbaum’ (mit Wurzel s)
und damit die kürzesten Pfade von s zu den anderen Knoten
ermitteln.
Der Algorithmus entdeckt zunächst die Knoten mit Entfernung k
und dann die mit Entfernung k + 1, daher der Name. Er geht erst
in die Breite...
Frank Heitmann [email protected]
w
x
Der Speicherplatzbedarf ist in Θ(V 2 ) (unabhängig von der
Kantenzahl).
Frank Heitmann [email protected]
v
w
y
Bei einer Adjazenzmatrix hat man eine n × n-Matrix, bei der an
der Stelle (i, j) genau dann eine 1 steht, wenn vi und vj verbunden
sind.
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Anmerkung
Durch die Queue wird sichergestellt, dass die Knoten ’in der Breite’
besucht werden.
139/145
Frank Heitmann [email protected]
140/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Tiefensuche - Die Idee
Tiefensuche - Die Idee
Starte mit Knoten s in einem Stack S.
Wiederhole solange S nicht leer...
Bei der Tiefensuche geht man einfach immer weiter noch
ungeprüfte Kanten entlang, so lange dies möglich ist. Mein folgt
also ’einem Pfad’ so lange es möglich ist. Erst wenn man einen
Konten erreicht von dem aus man nur bereits besuchte Knoten
erreichen kann, geht man einen Schritt zurück.
Nimm obersten Knoten v aus S.
(Bearbeite diesen und Färbe diesen so, dass er nicht wieder
besucht wird.)
Tue alle Nachbarn von v , die bisher nicht besucht wurden auf
den Stack.
Bleiben unentdeckte Knoten übrig wählt man diese als neue
Startknoten. So kann sich (bei einem unzusammenhängenden
Graphen) ein Tiefensuchwald ergeben. (Die Breitensuche kann man
auch so anpassen, aber typischerweise werden die Algorithmen so
benutzt.)
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Anmerkung
Durch den Stack wird sichergestellt, dass die Knoten ’in der Tiefe’
besucht werden.
141/145
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Frank Heitmann [email protected]
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Breiten- und Tiefensuche - Erweiterungen
142/145
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Breiten- und Tiefensuche - Zusammenfassung
Zusammenfassung
Breitensuche nutzt eine Queue, Tiefensuche einen Stack. (Die
Tiefensuche wie im [Cormen] kommt ohne Stack aus, arbeitet
dafür aber rekursiv und mit Zeitstempeln.)
Die Breitensuche kann mit ’distance’-Stempeln angereichert
werden, um so die kürzesten Abstände von s zu ermitteln.
Beide Operationen laufen in Θ(V + E ), wenn der Graph
mittels Adjazenzlisten gegeben ist.
Die Tiefensuche kann mit ’discovery’ und ’finished’ Zeit
angereichert werden. So können die Kanten klassifiziert
werden und man kann z.B. Kreise finden und noch andere
Dinge tun. Wie oben kann man mit dem Vorgänger einen
Tiefensuchbaum konstruieren.
Die Breitensuche hat (meist) nur einen Startknoten. Sie wird
oft verwendet, um kürzeste Abstände und den
Vorgängerteilgraphen zu ermitteln.
Die Tiefensuche ermittelt einen Tiefensuchwald (mehrere
Startknoten). Sie wird oft als Unterroutine in anderen
Algorithmen verwendet.
Frank Heitmann [email protected]
143/145
Frank Heitmann [email protected]
144/145
Grundlagen
Breiten- und Tiefensuche
Anwendung der Tiefensuche
Topologisches Sortieren
Zusammenhangskomponenten
Wiederholung
Auf einen Blick...
Graphen
Grundlagen, Adjazenzmatrix, Adjazenzliste
Breiten- & Tiefensuche
Ausblick: Anwendung der Tiefensuche
Ausblick: Minimale Spannbäume
Frank Heitmann [email protected]
145/145
Herunterladen