Algorithmen und Datenstrukturen

Werbung
Algorithmen und Datenstrukturen
Dr. Michael Brinkmeier
Technische Universität Ilmenau
Fakultät Informatik und Automatisierung
Fachgebiet Automaten und Formale Sprachen
11.7.2007
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
1 / 26
Algorithmen auf Graphen
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
2 / 26
Graphtraverse
Graphtraverse
In vielen Anwendungen ist es notwendig einen gegebenen Graphen
systematisch zu durchsuchen, bzw. für jeden Knoten und/oder jede Kante
eine bestimmte Berechnung durchzuführen.
Wenn alle Knoten und Kanten des Graphen bekannt sind, kann dies
teilweise durch Ablaufen der jeweiligen Listen geschehen.
In vielen Anwendungen ist jedoch ein anderes Herangehen effizienter oder
notwendig.
Weiß man z.B., dass der gesuchte Knoten in der Nähe eines bereits
bekannten Knotens ist, ist es sinnvoll die Nachbarschaft systematisch zu
durchsuchen.
In anderen fällen ist der Graph nicht vollständig bekannt, bzw. passt nicht
vollständig in den Speicher (z.B. Web-Crawler).
Für solche Fälle eignen sich die Tiefen- und Breitensuche oder
Modifikationen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
3 / 26
Graphtraverse
Graphtraverse
In vielen Anwendungen ist es notwendig einen gegebenen Graphen
systematisch zu durchsuchen, bzw. für jeden Knoten und/oder jede Kante
eine bestimmte Berechnung durchzuführen.
Wenn alle Knoten und Kanten des Graphen bekannt sind, kann dies
teilweise durch Ablaufen der jeweiligen Listen geschehen.
In vielen Anwendungen ist jedoch ein anderes Herangehen effizienter oder
notwendig.
Weiß man z.B., dass der gesuchte Knoten in der Nähe eines bereits
bekannten Knotens ist, ist es sinnvoll die Nachbarschaft systematisch zu
durchsuchen.
In anderen fällen ist der Graph nicht vollständig bekannt, bzw. passt nicht
vollständig in den Speicher (z.B. Web-Crawler).
Für solche Fälle eignen sich die Tiefen- und Breitensuche oder
Modifikationen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
3 / 26
Graphtraverse
Graphtraverse
In vielen Anwendungen ist es notwendig einen gegebenen Graphen
systematisch zu durchsuchen, bzw. für jeden Knoten und/oder jede Kante
eine bestimmte Berechnung durchzuführen.
Wenn alle Knoten und Kanten des Graphen bekannt sind, kann dies
teilweise durch Ablaufen der jeweiligen Listen geschehen.
In vielen Anwendungen ist jedoch ein anderes Herangehen effizienter oder
notwendig.
Weiß man z.B., dass der gesuchte Knoten in der Nähe eines bereits
bekannten Knotens ist, ist es sinnvoll die Nachbarschaft systematisch zu
durchsuchen.
In anderen fällen ist der Graph nicht vollständig bekannt, bzw. passt nicht
vollständig in den Speicher (z.B. Web-Crawler).
Für solche Fälle eignen sich die Tiefen- und Breitensuche oder
Modifikationen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
3 / 26
Graphtraverse
Graphtraverse
In vielen Anwendungen ist es notwendig einen gegebenen Graphen
systematisch zu durchsuchen, bzw. für jeden Knoten und/oder jede Kante
eine bestimmte Berechnung durchzuführen.
Wenn alle Knoten und Kanten des Graphen bekannt sind, kann dies
teilweise durch Ablaufen der jeweiligen Listen geschehen.
In vielen Anwendungen ist jedoch ein anderes Herangehen effizienter oder
notwendig.
Weiß man z.B., dass der gesuchte Knoten in der Nähe eines bereits
bekannten Knotens ist, ist es sinnvoll die Nachbarschaft systematisch zu
durchsuchen.
In anderen fällen ist der Graph nicht vollständig bekannt, bzw. passt nicht
vollständig in den Speicher (z.B. Web-Crawler).
Für solche Fälle eignen sich die Tiefen- und Breitensuche oder
Modifikationen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
3 / 26
Graphtraverse
Graphtraverse
In vielen Anwendungen ist es notwendig einen gegebenen Graphen
systematisch zu durchsuchen, bzw. für jeden Knoten und/oder jede Kante
eine bestimmte Berechnung durchzuführen.
Wenn alle Knoten und Kanten des Graphen bekannt sind, kann dies
teilweise durch Ablaufen der jeweiligen Listen geschehen.
In vielen Anwendungen ist jedoch ein anderes Herangehen effizienter oder
notwendig.
Weiß man z.B., dass der gesuchte Knoten in der Nähe eines bereits
bekannten Knotens ist, ist es sinnvoll die Nachbarschaft systematisch zu
durchsuchen.
In anderen fällen ist der Graph nicht vollständig bekannt, bzw. passt nicht
vollständig in den Speicher (z.B. Web-Crawler).
Für solche Fälle eignen sich die Tiefen- und Breitensuche oder
Modifikationen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
3 / 26
Graphtraverse
Graphtraverse
In vielen Anwendungen ist es notwendig einen gegebenen Graphen
systematisch zu durchsuchen, bzw. für jeden Knoten und/oder jede Kante
eine bestimmte Berechnung durchzuführen.
Wenn alle Knoten und Kanten des Graphen bekannt sind, kann dies
teilweise durch Ablaufen der jeweiligen Listen geschehen.
In vielen Anwendungen ist jedoch ein anderes Herangehen effizienter oder
notwendig.
Weiß man z.B., dass der gesuchte Knoten in der Nähe eines bereits
bekannten Knotens ist, ist es sinnvoll die Nachbarschaft systematisch zu
durchsuchen.
In anderen fällen ist der Graph nicht vollständig bekannt, bzw. passt nicht
vollständig in den Speicher (z.B. Web-Crawler).
Für solche Fälle eignen sich die Tiefen- und Breitensuche oder
Modifikationen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
3 / 26
Graphtraverse
Algorithmen auf Graphen
Graphtraverse
Tiefensuche
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
4 / 26
Graphtraverse
Die Tiefensuche
Bei der Tiefensuche (Depth-First-Search, DFS) gehen wir von einem
Knoten zuerst in die Tiefe.
Wenn wir einen Knoten v besuchen, wählen wir
'&%$
!"#
einen seiner noch unbesuchten Nachfolger u aus
v@
~~ @@@
und
führen im nächsten Schritt eine Tiefensuche,
~
@@
~
@@
~~
~
beginnend
bei u aus.
~~
!"#
'&%$
!"#
'&%$
'&%$
!"#
u @@
∗
∗
@@
Damit besuchen wir die Nachfolger von u bevor
@@
@@
seine Geschwister“ , d.h. die anderen Kinder von
!"#
”
'&%$
!"#
'&%$
'&%$
!"#
∗
∗
∗
v besucht werden.
Dies kann entweder mittels einer Rekursion oder eines Stacks realisiert
werden.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
5 / 26
Graphtraverse
Die Tiefensuche
Bei der Tiefensuche (Depth-First-Search, DFS) gehen wir von einem
Knoten zuerst in die Tiefe.
Wenn wir einen Knoten v besuchen, wählen wir
'&%$
!"#
einen seiner noch unbesuchten Nachfolger u aus
v@
~~ @@@
und
führen im nächsten Schritt eine Tiefensuche,
~
~
@@
~~
@@
~
beginnend
bei u aus.
~~
!"#
'&%$
!"#
'&%$
'&%$
!"#
u @@
∗
∗
@@
Damit besuchen wir die Nachfolger von u bevor
@@
@@
seine Geschwister“ , d.h. die anderen Kinder von
!"#
”
'&%$
!"#
'&%$
'&%$
!"#
∗
∗
∗
v besucht werden.
Dies kann entweder mittels einer Rekursion oder eines Stacks realisiert
werden.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
5 / 26
Graphtraverse
Die Tiefensuche
Bei der Tiefensuche (Depth-First-Search, DFS) gehen wir von einem
Knoten zuerst in die Tiefe.
Wenn wir einen Knoten v besuchen, wählen wir
'&%$
!"#
einen seiner noch unbesuchten Nachfolger u aus
v@
~~ @@@
und
führen im nächsten Schritt eine Tiefensuche,
~
~
@@
~~
@@
~
beginnend
bei u aus.
~~
!"#
'&%$
!"#
'&%$
'&%$
!"#
u @@
∗
∗
@@
Damit besuchen wir die Nachfolger von u bevor
@@
@@
seine Geschwister“ , d.h. die anderen Kinder von
!"#
”
'&%$
!"#
'&%$
'&%$
!"#
∗
∗
∗
v besucht werden.
Dies kann entweder mittels einer Rekursion oder eines Stacks realisiert
werden.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
5 / 26
Graphtraverse
Die Tiefensuche
Bei der Tiefensuche (Depth-First-Search, DFS) gehen wir von einem
Knoten zuerst in die Tiefe.
Wenn wir einen Knoten v besuchen, wählen wir
'&%$
!"#
einen seiner noch unbesuchten Nachfolger u aus
v@
~~ @@@
und
führen im nächsten Schritt eine Tiefensuche,
~
~
@@
~~
@@
~
beginnend
bei u aus.
~~
!"#
'&%$
!"#
'&%$
'&%$
!"#
u @@
∗
∗
@@
Damit besuchen wir die Nachfolger von u bevor
@@
@@
seine Geschwister“ , d.h. die anderen Kinder von
!"#
”
'&%$
!"#
'&%$
'&%$
!"#
∗
∗
∗
v besucht werden.
Dies kann entweder mittels einer Rekursion oder eines Stacks realisiert
werden.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
5 / 26
Graphtraverse
Die Tiefensuche
Bei der Tiefensuche (Depth-First-Search, DFS) gehen wir von einem
Knoten zuerst in die Tiefe.
Wenn wir einen Knoten v besuchen, wählen wir
'&%$
!"#
einen seiner noch unbesuchten Nachfolger u aus
v@
~~ @@@
und
führen im nächsten Schritt eine Tiefensuche,
~
~
@@
~~
@@
~
beginnend
bei u aus.
~~
!"#
'&%$
!"#
'&%$
'&%$
!"#
u @@
∗
∗
@@
Damit besuchen wir die Nachfolger von u bevor
@@
@@
seine Geschwister“ , d.h. die anderen Kinder von
!"#
”
'&%$
!"#
'&%$
'&%$
!"#
∗
∗
∗
v besucht werden.
Dies kann entweder mittels einer Rekursion oder eines Stacks realisiert
werden.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
5 / 26
Graphtraverse
Die Tiefensuche
Bei der Tiefensuche (Depth-First-Search, DFS) gehen wir von einem
Knoten zuerst in die Tiefe.
Wenn wir einen Knoten v besuchen, wählen wir
'&%$
!"#
einen seiner noch unbesuchten Nachfolger u aus
v@
~~ @@@
und
führen im nächsten Schritt eine Tiefensuche,
~
~
@@
~~
@@
~
beginnend
bei u aus.
~~
!"#
'&%$
!"#
'&%$
'&%$
!"#
u @@
∗
∗
@@
Damit besuchen wir die Nachfolger von u bevor
@@
@@
seine Geschwister“ , d.h. die anderen Kinder von
!"#
”
'&%$
!"#
'&%$
'&%$
!"#
∗
∗
∗
v besucht werden.
Dies kann entweder mittels einer Rekursion oder eines Stacks realisiert
werden.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
5 / 26
Graphtraverse
Prozedur (DFS mittels Rekursion)
Eingabe: Ein Graph G = (V , E )
Daten: Ein Feld scanned[1 . . . |V |] von Markierungen.
für v = 1, . . . , n tue scanned[v ] := 0
solange ein Knoten v mit scanned[v ] = 0 existiert tue
DFS visit(v , G , scanned)
Ende
Prozedur (DFS visit)
Eingabe: Graph G = (V , E ), v ∈ V und scanned[1 . . . |V |]
scanned[v ] := 1
für alle u ∈ succ[v ] mit scanned[u] = 0 tue
DFS visit(G , u, scanned)
Ende
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
6 / 26
Graphtraverse
Prozedur (DFS mittels Rekursion)
Eingabe: Ein Graph G = (V , E )
Daten: Ein Feld scanned[1 . . . |V |] von Markierungen.
für v = 1, . . . , n tue scanned[v ] := 0
solange ein Knoten v mit scanned[v ] = 0 existiert tue
DFS visit(v , G , scanned)
Ende
Prozedur (DFS visit)
Eingabe: Graph G = (V , E ), v ∈ V und scanned[1 . . . |V |]
scanned[v ] := 1
für alle u ∈ succ[v ] mit scanned[u] = 0 tue
DFS visit(G , u, scanned)
Ende
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
6 / 26
Graphtraverse
Laufzeit der Tiefensuche
Satz
Die Prozedur DFS benötigt zur Durchmusterung eines Graphen
G = (V , E ) O(|V | + |E |) Schritte.
Beweis
Die Initialisierung kostet O(|V |), denn für jeden Knoten muss scanned[v ]
auf 0 gesetzt werden.
Beginnen wir die Tiefensuche mit Knoten 1, können wir bei der Rückkehr
in die Prozedur einfach den nächsten unbesuchten Knoten in numerischer
Reihenfolge suchen. Damit muss bei der Suche nach dem nächsten
unerforschten Knoten jeder Knoten nur einmal inspiziert werden. Dies
führt zu einer Gesamtlaufzeit von O(|V |).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
7 / 26
Graphtraverse
Laufzeit der Tiefensuche
Satz
Die Prozedur DFS benötigt zur Durchmusterung eines Graphen
G = (V , E ) O(|V | + |E |) Schritte.
Beweis
Die Initialisierung kostet O(|V |), denn für jeden Knoten muss scanned[v ]
auf 0 gesetzt werden.
Beginnen wir die Tiefensuche mit Knoten 1, können wir bei der Rückkehr
in die Prozedur einfach den nächsten unbesuchten Knoten in numerischer
Reihenfolge suchen. Damit muss bei der Suche nach dem nächsten
unerforschten Knoten jeder Knoten nur einmal inspiziert werden. Dies
führt zu einer Gesamtlaufzeit von O(|V |).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
7 / 26
Graphtraverse
Laufzeit der Tiefensuche
Satz
Die Prozedur DFS benötigt zur Durchmusterung eines Graphen
G = (V , E ) O(|V | + |E |) Schritte.
Beweis
Die Initialisierung kostet O(|V |), denn für jeden Knoten muss scanned[v ]
auf 0 gesetzt werden.
Beginnen wir die Tiefensuche mit Knoten 1, können wir bei der Rückkehr
in die Prozedur einfach den nächsten unbesuchten Knoten in numerischer
Reihenfolge suchen. Damit muss bei der Suche nach dem nächsten
unerforschten Knoten jeder Knoten nur einmal inspiziert werden. Dies
führt zu einer Gesamtlaufzeit von O(|V |).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
7 / 26
Graphtraverse
Beweis (Laufzeit der Tiefensuche - Fortsetzung)
Der Zeitbedarf für einen Aufruf von DFS visit, ohne die Zeit für die
rekursiven Aufrufe, ist durch proportional zu der Anzahl der Nachfolger
des besuchten Knotens.
Da DFS visit für jeden Knoten genau einmal aufgerufen wird, ergibt sich
somit ein Zeitbedarf von O(|V | + |E |).
Insgesamt ergibt sich für DFS somit ein Zeitaufwand von O(|V | + |E |).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
8 / 26
Graphtraverse
Beweis (Laufzeit der Tiefensuche - Fortsetzung)
Der Zeitbedarf für einen Aufruf von DFS visit, ohne die Zeit für die
rekursiven Aufrufe, ist durch proportional zu der Anzahl der Nachfolger
des besuchten Knotens.
Da DFS visit für jeden Knoten genau einmal aufgerufen wird, ergibt sich
somit ein Zeitbedarf von O(|V | + |E |).
Insgesamt ergibt sich für DFS somit ein Zeitaufwand von O(|V | + |E |).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
8 / 26
Graphtraverse
Beweis (Laufzeit der Tiefensuche - Fortsetzung)
Der Zeitbedarf für einen Aufruf von DFS visit, ohne die Zeit für die
rekursiven Aufrufe, ist durch proportional zu der Anzahl der Nachfolger
des besuchten Knotens.
Da DFS visit für jeden Knoten genau einmal aufgerufen wird, ergibt sich
somit ein Zeitbedarf von O(|V | + |E |).
Insgesamt ergibt sich für DFS somit ein Zeitaufwand von O(|V | + |E |).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
8 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
()*+
//.-,
d
h
c
i
b
d
j
a
g
e
.-,
//()*+
g
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
()*+
//.-,
d
h
c
i
b
d
j
a
g
e
.-,
//()*+
g
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
h
1
()*+
/.-,
/d
c
i
b
d
j
a
g
e
.-,
//()*+
g
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
h
1
()*+
/.-,
/d
.-,
//()*+
g
b
2
c
i
d
j
e
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
a
Algorithmen und Datenstrukturen
g
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
1
()*+
/.-,
/d
.-,
//()*+
g
b
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
h
2
c
i
d
j
e
3
a
Algorithmen und Datenstrukturen
g
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
1
()*+
/.-,
/d
.-,
//()*+
g
b
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
h
2
c
i
d
j
e
3
a
Algorithmen und Datenstrukturen
g
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
1
()*+
/.-,
/d
.-,
//()*+
g
b
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
h
2
c
i
d
j
e
3
a
Algorithmen und Datenstrukturen
g
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
1
()*+
/.-,
/d
.-,
//()*+
g
b
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
h
c
i
d
j
2 4
e
3
a
Algorithmen und Datenstrukturen
g
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
1
()*+
/.-,
/d
.-,
//()*+
g
b
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
h
c
i
d
j
2 4
3
5
a
g
Algorithmen und Datenstrukturen
11.7.2007
e
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
1
()*+
/.-,
/d
.-,
//()*+
g
b
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
h
c
i
d
j
2 4
3
5
a
g
Algorithmen und Datenstrukturen
11.7.2007
e
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
1
()*+
/.-,
/d
.-,
//()*+
g
b
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
h
c
i
d
j
2 4
3
5
a
g
Algorithmen und Datenstrukturen
11.7.2007
e
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f
1
()*+
/.-,
/d
.-,
//()*+
g
b
/()*+
/ .-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
h
c
i
d
j
2 4
3
5
a
g
Algorithmen und Datenstrukturen
11.7.2007
e
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f =
=
1
()*+
/.-,
/d
c
.-,
//()*+
g
b
()*+
//.-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
2 4
d
3
5
a
g
Algorithmen und Datenstrukturen
h
=
6==
=
i
e
j
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f =
=
1
()*+
/.-,
/d
c
.-,
//()*+
g
b
()*+
//.-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
2 4
d
3
5
a
g
Algorithmen und Datenstrukturen
h
=
6==
=
i
e
7
j
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f =
=
1
()*+
/.-,
/d
c
.-,
//()*+
g
b
()*+
//.-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
2 4
d
3
5
a
g
Algorithmen und Datenstrukturen
h
=
6==
=
i
e
7
j
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
/()*+
/ .-,
i
f =
=
1
()*+
/.-,
/d
c
.-,
//()*+
g
b
()*+
//.-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
2 4
d
3
5
a
g
Algorithmen und Datenstrukturen
h
=
6==
=
i
e
7
j
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
.-,
//()*+
i
f =
=
1
()*+
/.-,
/d
c
.-,
//()*+
g
b
()*+
//.-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
2 4
d
3
5
a
g
Algorithmen und Datenstrukturen
h
=
6==
=
i
e
7
j
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
.-,
//()*+
i
f =
=
1
()*+
/.-,
/d
c
.-,
//()*+
g
b
()*+
//.-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
2 4
d
3
5
a
g
Algorithmen und Datenstrukturen
h
=
6==
=
9
i
e
7
j
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
.-,
//()*+
i
f =
=
1
()*+
/.-,
/d
c
.-,
//()*+
g
b
()*+
//.-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
2 4
d
3
5
a
g
Algorithmen und Datenstrukturen
h
=
6==
=
9
i
e
7
j
11.7.2007
9 / 26
Graphtraverse
Tiefensuche - Ein Beispiel
/.-,
()*+
aO ??
??
??
??
()*+
/.-,
()*+
/.-,
cO
bo
/.-,
()*+
eO
()*+
//.-,
f
()*+
/.-,
h
.-,
//()*+
i
f =
=
1
()*+
/.-,
/d
c
.-,
//()*+
g
b
()*+
//.-,
j
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
2 4
d
3
5
a
g
Algorithmen und Datenstrukturen
h
=
6==
=
9
i
e
7
j
11.7.2007
9 / 26
Graphtraverse
Bemerkungen zur Tiefensuche
Bei der Tiefensuche, bilden die benutzten Kanten eine Spannwald des
ursprünglichen Graphen
◮
d.h. die benutzten Kanten bilden einen azyklischen Teilgraphen, der
alle Knoten enthält
◮
Der konstruierte Spannwald muss nicht zusammenhängend sein!
◮
Im Falle eines ungerichteten Graphen, entspricht jede
Zusammenhangskomponente des Spannwaldes einer
Zusammenhangskomponente des Graphen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
10 / 26
Graphtraverse
Bemerkungen zur Tiefensuche
Bei der Tiefensuche, bilden die benutzten Kanten eine Spannwald des
ursprünglichen Graphen
◮
d.h. die benutzten Kanten bilden einen azyklischen Teilgraphen, der
alle Knoten enthält
◮
Der konstruierte Spannwald muss nicht zusammenhängend sein!
◮
Im Falle eines ungerichteten Graphen, entspricht jede
Zusammenhangskomponente des Spannwaldes einer
Zusammenhangskomponente des Graphen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
10 / 26
Graphtraverse
Bemerkungen zur Tiefensuche
Bei der Tiefensuche, bilden die benutzten Kanten eine Spannwald des
ursprünglichen Graphen
◮
d.h. die benutzten Kanten bilden einen azyklischen Teilgraphen, der
alle Knoten enthält
◮
Der konstruierte Spannwald muss nicht zusammenhängend sein!
◮
Im Falle eines ungerichteten Graphen, entspricht jede
Zusammenhangskomponente des Spannwaldes einer
Zusammenhangskomponente des Graphen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
10 / 26
Graphtraverse
Bemerkungen zur Tiefensuche
Bei der Tiefensuche, bilden die benutzten Kanten eine Spannwald des
ursprünglichen Graphen
◮
d.h. die benutzten Kanten bilden einen azyklischen Teilgraphen, der
alle Knoten enthält
◮
Der konstruierte Spannwald muss nicht zusammenhängend sein!
◮
Im Falle eines ungerichteten Graphen, entspricht jede
Zusammenhangskomponente des Spannwaldes einer
Zusammenhangskomponente des Graphen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
10 / 26
Graphtraverse
Algorithmen auf Graphen
Graphtraverse
Breitensuche
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
11 / 26
Graphtraverse
Die Breitensuche
Während bei der Tiefensuche erst die Nachfolger eines Nachfolgers
besucht wurden, werden bei der Breitensuche (Breadth-First-Search, BFS)
zuerst alle Nachfolger besucht, bevor deren Nachfolger bearbeitet werden.
Die Breitensuche können wir ohne Rekursion mittels einer Warteschlange
(Queue) implementieren.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
12 / 26
Graphtraverse
Die Breitensuche
Während bei der Tiefensuche erst die Nachfolger eines Nachfolgers
besucht wurden, werden bei der Breitensuche (Breadth-First-Search, BFS)
zuerst alle Nachfolger besucht, bevor deren Nachfolger bearbeitet werden.
Die Breitensuche können wir ohne Rekursion mittels einer Warteschlange
(Queue) implementieren.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
12 / 26
Graphtraverse
Prozedur (BFS)
Eingabe: Ein Graph G = (V , E )
Daten: Ein Feld scanned[1 . . . |V |] von Markierungen und eine
Queue Q.
für v = 1, . . . , n tue scanned[v ] := 0
solange ein Knoten v mit scanned[v ] = 0 existiert tue
scanned[v ] := 1, Q := (Q, v )
solange Q 6= ∅ tue
Entnehme das erste Element v aus Q
für alle u ∈ succ[v ] mit scanned[u] = 0 tue
// Besuche alle unbesuchten Nachfolger
scanned[u] := 1, Q := (Q, u)
Ende
Ende
Ende
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
13 / 26
Graphtraverse
Laufzeit der Breitensuche
Wie bei der Tiefensuche ergibt sich
Satz
Die Prozedur BFS benötigt zur Durchmusterung eines Graphen
G = (V , E ) O(|V | + |E |) Schritte.
Analog zur Breitensuche mit einer Queue kann man die Tiefensuche ohne
Rekursion mit einem Stack realisieren.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
14 / 26
Graphtraverse
Laufzeit der Breitensuche
Wie bei der Tiefensuche ergibt sich
Satz
Die Prozedur BFS benötigt zur Durchmusterung eines Graphen
G = (V , E ) O(|V | + |E |) Schritte.
Analog zur Breitensuche mit einer Queue kann man die Tiefensuche ohne
Rekursion mit einem Stack realisieren.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
14 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
()*+
/.-,
d
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
Queue:
f
b
c
g
i
e
d
a
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
()*+
/.-,
d
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
Queue: c,g,i,e
f
b
c
g
i
e
d
a
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue: g,i,e
f
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
b
c
g
i
e
d
a
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue: g,i,e,b,d,a
f
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
b
c
g
i
e
d
a
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue: i,e,b,d,a
f
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
b
2
c
g
i
e
d
a
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue: e,b,d,a
f =
=
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
b
2
c
g
d
a
=
3==
=
i
e
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue: e,b,d,a,j,h
f =
=
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
b
2
c
g
d
a
=
3==
=
i
e
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue: b,d,a,j,h
c
f =NNNN
== NN
N
2
3== 4NNNN
NNN
=
g
e
i
d
a
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
b
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue: d,a,j,h
c
f =NNNN
== NN
N
2
3== 4NNNN
NNN
=
g
e
i
d
a
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
b
5
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue: a,j,h
c
f =NNNN
== NN
N
2
3== 4NNNN
NNN
=
g
e
i
d
a
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
b
6
5
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue: j,h
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
f
()*+
/.-,
g
()*+
/.-,
h
()*+
/.-,
i
()*+
/.-,
j
b
c
====
5 6 7====
d
f =NNNN
== NN
N
2
3== 4NNNN
NNN
=
g
e
i
a
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue: h
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
h
()*+
/.-,
f
()*+
/.-,
i
()*+
/.-,
g
()*+
/.-,
j
b
c
====
5 6 7====
d
f =NNNN
== NN
N
2
3== 4NNNN
NNN
=
g
e
i
7
a
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue:
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
h
()*+
/.-,
f
()*+
/.-,
i
()*+
/.-,
g
()*+
/.-,
j
b
c
====
5 6 7====
d
f =NNNN
== NN
N
2
3== 4NNNN
NNN
=
g
e
i <<
7
a
<
8<<
<
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Breitensuche - Ein Beispiel
/.-,
()*+
a ??
??
??
??
()*+
/.-,
()*+
/.-,
c
b
Queue:
()*+
/.-,
d
1
()*+
/.-,
e
()*+
/.-,
h
()*+
/.-,
f
()*+
/.-,
i
()*+
/.-,
g
()*+
/.-,
j
b
c
====
5 6 7====
d
f =NNNN
== NN
N
2
3== 4NNNN
NNN
=
g
e
i <<
7
a
<
8<<
<
j
h
Startknoten: f
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
15 / 26
Graphtraverse
Topologische Ordnung
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
16 / 26
Graphtraverse
Topologische Ordnung
In vielen Anwendungen sind gerichtete azyklische Graphen von Bedeutung.
Dabei spielt insbesondere die Existenz einer topologischen Ordnung auf
einem solchen Graphen eine große Rolle.
Definition (Topologische Ordnung)
Eine topologische Schichtung auf einem gerichteten Graphen G = (V , E )
ist eine Abbildung ord : V → {1, . . . , n} mit n = |V |, so dass für jede
Kante (u, v ) ∈ E die Ungleichung ord(u) < ord(v ) gilt.
Ist die Abbildung ord bijektiv, spricht man von einer topologischen
Ordnung.
Eine topologische Schichtung kann somit als eine Einteilung der Knoten in
maximal n Schichten interpretiert werden, so dass eine Kante nur von
einer niedrigeren in eine höhere Schicht führt.
Eine topologische Ordnung ist eine spezielle Schichtung, bei der jede
Schicht genau einen Knoten enthält.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
17 / 26
Graphtraverse
Topologische Ordnung
In vielen Anwendungen sind gerichtete azyklische Graphen von Bedeutung.
Dabei spielt insbesondere die Existenz einer topologischen Ordnung auf
einem solchen Graphen eine große Rolle.
Definition (Topologische Ordnung)
Eine topologische Schichtung auf einem gerichteten Graphen G = (V , E )
ist eine Abbildung ord : V → {1, . . . , n} mit n = |V |, so dass für jede
Kante (u, v ) ∈ E die Ungleichung ord(u) < ord(v ) gilt.
Ist die Abbildung ord bijektiv, spricht man von einer topologischen
Ordnung.
Eine topologische Schichtung kann somit als eine Einteilung der Knoten in
maximal n Schichten interpretiert werden, so dass eine Kante nur von
einer niedrigeren in eine höhere Schicht führt.
Eine topologische Ordnung ist eine spezielle Schichtung, bei der jede
Schicht genau einen Knoten enthält.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
17 / 26
Graphtraverse
Topologische Ordnung
In vielen Anwendungen sind gerichtete azyklische Graphen von Bedeutung.
Dabei spielt insbesondere die Existenz einer topologischen Ordnung auf
einem solchen Graphen eine große Rolle.
Definition (Topologische Ordnung)
Eine topologische Schichtung auf einem gerichteten Graphen G = (V , E )
ist eine Abbildung ord : V → {1, . . . , n} mit n = |V |, so dass für jede
Kante (u, v ) ∈ E die Ungleichung ord(u) < ord(v ) gilt.
Ist die Abbildung ord bijektiv, spricht man von einer topologischen
Ordnung.
Eine topologische Schichtung kann somit als eine Einteilung der Knoten in
maximal n Schichten interpretiert werden, so dass eine Kante nur von
einer niedrigeren in eine höhere Schicht führt.
Eine topologische Ordnung ist eine spezielle Schichtung, bei der jede
Schicht genau einen Knoten enthält.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
17 / 26
Graphtraverse
Topologische Ordnung
In vielen Anwendungen sind gerichtete azyklische Graphen von Bedeutung.
Dabei spielt insbesondere die Existenz einer topologischen Ordnung auf
einem solchen Graphen eine große Rolle.
Definition (Topologische Ordnung)
Eine topologische Schichtung auf einem gerichteten Graphen G = (V , E )
ist eine Abbildung ord : V → {1, . . . , n} mit n = |V |, so dass für jede
Kante (u, v ) ∈ E die Ungleichung ord(u) < ord(v ) gilt.
Ist die Abbildung ord bijektiv, spricht man von einer topologischen
Ordnung.
Eine topologische Schichtung kann somit als eine Einteilung der Knoten in
maximal n Schichten interpretiert werden, so dass eine Kante nur von
einer niedrigeren in eine höhere Schicht führt.
Eine topologische Ordnung ist eine spezielle Schichtung, bei der jede
Schicht genau einen Knoten enthält.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
17 / 26
Graphtraverse
Topologische Schichtung - ein Beispiel
/
//
//
//
//
//
// // ?
??

??

??

?? 








Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
18 / 26
Graphtraverse
Topologische Schichtung - ein Beispiel
ord(v ) = 1
ord(v ) = 2
ord(v ) = 3
ord(v ) = 4
ord(v ) = 5
/
//
//
//
//
//
// // ?
??

??

??

?? 








Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
18 / 26
Graphtraverse
Topologische Schichtung - ein Beispiel
ord(v ) = 1
ord(v ) = 2
ord(v ) = 3
ord(v ) = 4
ord(v ) = 5
/
//
//
//
//
//
// // ?
??

??

??

?? 








Dr. Michael Brinkmeier (TU Ilmenau)
/
//
//
//
//
//
// // O ?
??

??

??

?? 








Algorithmen und Datenstrukturen
11.7.2007
18 / 26
Graphtraverse
Topologische Schichtungen und Ordnungen
Offensichtlich ist jede topologische Ordnung eine Schichtung. Aber wie ist
es umgekehrt?
Aus einer gegebenen Schichtung ord kann leicht eine topologische
Ordnung konstruiert werden, in dem die Knoten innerhalb einer Schicht
beliebig geordnet werden.
Sei ni die Anzahl der Knoten in der i -ten Schicht, d.h. der Knoten mit
ord(v ) = i . Dann hat jeder Knoten v zwei Ordnungszahlen, einmal seine
Schicht ord(v ) und zum zweiten eine Nummer int(v ) mit
1 ≤ int(v ) ≤ nord(v ) innerhalb seiner Schicht.
Die Gesamtordnung ord′ ergibt sich dann als:
ord(v )−1
′
ord (v ) :=
X
nj + int(v ).
j=1
Anders ausgedrückt: Die Schichten werden einzeln geordnet, und dann ihre
Ordnungen einfach aneinader gehängt“.
”
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
19 / 26
Graphtraverse
Topologische Schichtungen und Ordnungen
Offensichtlich ist jede topologische Ordnung eine Schichtung. Aber wie ist
es umgekehrt?
Aus einer gegebenen Schichtung ord kann leicht eine topologische
Ordnung konstruiert werden, in dem die Knoten innerhalb einer Schicht
beliebig geordnet werden.
Sei ni die Anzahl der Knoten in der i -ten Schicht, d.h. der Knoten mit
ord(v ) = i . Dann hat jeder Knoten v zwei Ordnungszahlen, einmal seine
Schicht ord(v ) und zum zweiten eine Nummer int(v ) mit
1 ≤ int(v ) ≤ nord(v ) innerhalb seiner Schicht.
Die Gesamtordnung ord′ ergibt sich dann als:
ord(v )−1
′
ord (v ) :=
X
nj + int(v ).
j=1
Anders ausgedrückt: Die Schichten werden einzeln geordnet, und dann ihre
Ordnungen einfach aneinader gehängt“.
”
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
19 / 26
Graphtraverse
Topologische Schichtungen und Ordnungen
Offensichtlich ist jede topologische Ordnung eine Schichtung. Aber wie ist
es umgekehrt?
Aus einer gegebenen Schichtung ord kann leicht eine topologische
Ordnung konstruiert werden, in dem die Knoten innerhalb einer Schicht
beliebig geordnet werden.
Sei ni die Anzahl der Knoten in der i -ten Schicht, d.h. der Knoten mit
ord(v ) = i . Dann hat jeder Knoten v zwei Ordnungszahlen, einmal seine
Schicht ord(v ) und zum zweiten eine Nummer int(v ) mit
1 ≤ int(v ) ≤ nord(v ) innerhalb seiner Schicht.
Die Gesamtordnung ord′ ergibt sich dann als:
ord(v )−1
′
ord (v ) :=
X
nj + int(v ).
j=1
Anders ausgedrückt: Die Schichten werden einzeln geordnet, und dann ihre
Ordnungen einfach aneinader gehängt“.
”
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
19 / 26
Graphtraverse
Topologische Schichtungen und Ordnungen
Offensichtlich ist jede topologische Ordnung eine Schichtung. Aber wie ist
es umgekehrt?
Aus einer gegebenen Schichtung ord kann leicht eine topologische
Ordnung konstruiert werden, in dem die Knoten innerhalb einer Schicht
beliebig geordnet werden.
Sei ni die Anzahl der Knoten in der i -ten Schicht, d.h. der Knoten mit
ord(v ) = i . Dann hat jeder Knoten v zwei Ordnungszahlen, einmal seine
Schicht ord(v ) und zum zweiten eine Nummer int(v ) mit
1 ≤ int(v ) ≤ nord(v ) innerhalb seiner Schicht.
Die Gesamtordnung ord′ ergibt sich dann als:
ord(v )−1
′
ord (v ) :=
X
nj + int(v ).
j=1
Anders ausgedrückt: Die Schichten werden einzeln geordnet, und dann ihre
Ordnungen einfach aneinader gehängt“.
”
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
19 / 26
Graphtraverse
Topologische Schichtungen und Ordnungen
Offensichtlich ist jede topologische Ordnung eine Schichtung. Aber wie ist
es umgekehrt?
Aus einer gegebenen Schichtung ord kann leicht eine topologische
Ordnung konstruiert werden, in dem die Knoten innerhalb einer Schicht
beliebig geordnet werden.
Sei ni die Anzahl der Knoten in der i -ten Schicht, d.h. der Knoten mit
ord(v ) = i . Dann hat jeder Knoten v zwei Ordnungszahlen, einmal seine
Schicht ord(v ) und zum zweiten eine Nummer int(v ) mit
1 ≤ int(v ) ≤ nord(v ) innerhalb seiner Schicht.
Die Gesamtordnung ord′ ergibt sich dann als:
ord(v )−1
′
ord (v ) :=
X
nj + int(v ).
j=1
Anders ausgedrückt: Die Schichten werden einzeln geordnet, und dann ihre
Ordnungen einfach aneinader gehängt“.
”
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
19 / 26
Graphtraverse
Existenz von topologischen Ordnungen
Lemma (Existenz von topologischen Ordnungen)
Ein gerichteter Graph G = (V , E ) besitzt genau dann eine topologische
Ordnung, wenn er azyklisch ist.
Beweis
Nehmen wir zuerst an, dass G eine topologische Ordnung ord besitzt und
einen Kreis (u, v1 , . . . , vl−1 , u) enthält. Dann gilt offensichtlich:
ord(u) < ord(v1 ) < · · · < ord(vl−1 ) < ord(u)
was offensichtlich ein Widerspruch ist!
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
20 / 26
Graphtraverse
Existenz von topologischen Ordnungen
Lemma (Existenz von topologischen Ordnungen)
Ein gerichteter Graph G = (V , E ) besitzt genau dann eine topologische
Ordnung, wenn er azyklisch ist.
Beweis
Nehmen wir zuerst an, dass G eine topologische Ordnung ord besitzt und
einen Kreis (u, v1 , . . . , vl−1 , u) enthält. Dann gilt offensichtlich:
ord(u) < ord(v1 ) < · · · < ord(vl−1 ) < ord(u)
was offensichtlich ein Widerspruch ist!
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
20 / 26
Graphtraverse
Beweis (Existenz von topologischen Ordnung (Fortsetzung))
Jetzt wollen wir zeigen, dass wir eine topologische Ordnung konstruieren
können, wenn G azyklisch ist. Dazu führen wir eine Induktion über die
Anzahl der Knoten durch.
Falls n = 1, ist die Existenz einer topologischen Ordnung offensichtlich.
Sei nun n > 1. Zuerst behaupten wir, dass ein Knoten u in G existiert mit
din (u) = 0. Dies beweisen wir indirekt.
Angenommen es gibt keinen solchen Knoten. Dann können wir zu jedem
Knoten einen Vorgänger finden. D.h. wenn wir bei einem beliebigen
Knoten beginnen, können wir stets einer Kante rückwärts zu einem
anderen Knoten folgen.
Spätestens nachdem wir n verschiedene Knoten besucht haben (alle die es
gibt), müssen wir zu einem Knoten zurück kehren, den wir bereits besucht
hatten. Damit enthält G aber einen Kreis, was im Widerspruch zu seiner
Azyklizität steht.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
21 / 26
Graphtraverse
Beweis (Existenz von topologischen Ordnung (Fortsetzung))
Jetzt wollen wir zeigen, dass wir eine topologische Ordnung konstruieren
können, wenn G azyklisch ist. Dazu führen wir eine Induktion über die
Anzahl der Knoten durch.
Falls n = 1, ist die Existenz einer topologischen Ordnung offensichtlich.
Sei nun n > 1. Zuerst behaupten wir, dass ein Knoten u in G existiert mit
din (u) = 0. Dies beweisen wir indirekt.
Angenommen es gibt keinen solchen Knoten. Dann können wir zu jedem
Knoten einen Vorgänger finden. D.h. wenn wir bei einem beliebigen
Knoten beginnen, können wir stets einer Kante rückwärts zu einem
anderen Knoten folgen.
Spätestens nachdem wir n verschiedene Knoten besucht haben (alle die es
gibt), müssen wir zu einem Knoten zurück kehren, den wir bereits besucht
hatten. Damit enthält G aber einen Kreis, was im Widerspruch zu seiner
Azyklizität steht.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
21 / 26
Graphtraverse
Beweis (Existenz von topologischen Ordnung (Fortsetzung))
Jetzt wollen wir zeigen, dass wir eine topologische Ordnung konstruieren
können, wenn G azyklisch ist. Dazu führen wir eine Induktion über die
Anzahl der Knoten durch.
Falls n = 1, ist die Existenz einer topologischen Ordnung offensichtlich.
Sei nun n > 1. Zuerst behaupten wir, dass ein Knoten u in G existiert mit
din (u) = 0. Dies beweisen wir indirekt.
Angenommen es gibt keinen solchen Knoten. Dann können wir zu jedem
Knoten einen Vorgänger finden. D.h. wenn wir bei einem beliebigen
Knoten beginnen, können wir stets einer Kante rückwärts zu einem
anderen Knoten folgen.
Spätestens nachdem wir n verschiedene Knoten besucht haben (alle die es
gibt), müssen wir zu einem Knoten zurück kehren, den wir bereits besucht
hatten. Damit enthält G aber einen Kreis, was im Widerspruch zu seiner
Azyklizität steht.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
21 / 26
Graphtraverse
Beweis (Existenz von topologischen Ordnung (Fortsetzung))
Jetzt wollen wir zeigen, dass wir eine topologische Ordnung konstruieren
können, wenn G azyklisch ist. Dazu führen wir eine Induktion über die
Anzahl der Knoten durch.
Falls n = 1, ist die Existenz einer topologischen Ordnung offensichtlich.
Sei nun n > 1. Zuerst behaupten wir, dass ein Knoten u in G existiert mit
din (u) = 0. Dies beweisen wir indirekt.
Angenommen es gibt keinen solchen Knoten. Dann können wir zu jedem
Knoten einen Vorgänger finden. D.h. wenn wir bei einem beliebigen
Knoten beginnen, können wir stets einer Kante rückwärts zu einem
anderen Knoten folgen.
Spätestens nachdem wir n verschiedene Knoten besucht haben (alle die es
gibt), müssen wir zu einem Knoten zurück kehren, den wir bereits besucht
hatten. Damit enthält G aber einen Kreis, was im Widerspruch zu seiner
Azyklizität steht.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
21 / 26
Graphtraverse
Beweis (Existenz von topologischen Ordnung (Fortsetzung))
Jetzt wollen wir zeigen, dass wir eine topologische Ordnung konstruieren
können, wenn G azyklisch ist. Dazu führen wir eine Induktion über die
Anzahl der Knoten durch.
Falls n = 1, ist die Existenz einer topologischen Ordnung offensichtlich.
Sei nun n > 1. Zuerst behaupten wir, dass ein Knoten u in G existiert mit
din (u) = 0. Dies beweisen wir indirekt.
Angenommen es gibt keinen solchen Knoten. Dann können wir zu jedem
Knoten einen Vorgänger finden. D.h. wenn wir bei einem beliebigen
Knoten beginnen, können wir stets einer Kante rückwärts zu einem
anderen Knoten folgen.
Spätestens nachdem wir n verschiedene Knoten besucht haben (alle die es
gibt), müssen wir zu einem Knoten zurück kehren, den wir bereits besucht
hatten. Damit enthält G aber einen Kreis, was im Widerspruch zu seiner
Azyklizität steht.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
21 / 26
Graphtraverse
Beweis (Existenz von topologischen Ordnung (Fortsetzung))
Damit müssen wir irgendwann auf einen Knoten u stoßen, der keinen
Nachfolger besitzt, d.h. din (u) = 0.
Sei nun G ′ = G − u. Offensichtlich ist G ′ azyklisch und somit existiert
nach Induktionsvoraussetzung eine topologische Ordnung
ord′ : V \ {u} → {1, . . . , n − 1} von G ′ .
Auf G definieren wir ord : V → {1, . . . , n} als
(
ord′ (v ) + 1 falls v 6= u
ord(v ) :=
1
falls v = u.
Diese Abbildung ist eine topologische Ordnung, denn für alle Kanten
(v , v ′ ) mit v , v ′ 6= u gilt ord(v ) = ord′ (v ) + 1 < ord′ (v ′ ) + 1 = ord(v ′ )
und für alle Kanten (u, v ) gilt ord(u) = 1 < 2 ≤ ord′ (v ) + 1 = ord(v ).
Kanten der Form (v , u) gibt es nicht, da din (u) = 0.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
22 / 26
Graphtraverse
Beweis (Existenz von topologischen Ordnung (Fortsetzung))
Damit müssen wir irgendwann auf einen Knoten u stoßen, der keinen
Nachfolger besitzt, d.h. din (u) = 0.
Sei nun G ′ = G − u. Offensichtlich ist G ′ azyklisch und somit existiert
nach Induktionsvoraussetzung eine topologische Ordnung
ord′ : V \ {u} → {1, . . . , n − 1} von G ′ .
Auf G definieren wir ord : V → {1, . . . , n} als
(
ord′ (v ) + 1 falls v 6= u
ord(v ) :=
1
falls v = u.
Diese Abbildung ist eine topologische Ordnung, denn für alle Kanten
(v , v ′ ) mit v , v ′ 6= u gilt ord(v ) = ord′ (v ) + 1 < ord′ (v ′ ) + 1 = ord(v ′ )
und für alle Kanten (u, v ) gilt ord(u) = 1 < 2 ≤ ord′ (v ) + 1 = ord(v ).
Kanten der Form (v , u) gibt es nicht, da din (u) = 0.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
22 / 26
Graphtraverse
Beweis (Existenz von topologischen Ordnung (Fortsetzung))
Damit müssen wir irgendwann auf einen Knoten u stoßen, der keinen
Nachfolger besitzt, d.h. din (u) = 0.
Sei nun G ′ = G − u. Offensichtlich ist G ′ azyklisch und somit existiert
nach Induktionsvoraussetzung eine topologische Ordnung
ord′ : V \ {u} → {1, . . . , n − 1} von G ′ .
Auf G definieren wir ord : V → {1, . . . , n} als
(
ord′ (v ) + 1 falls v 6= u
ord(v ) :=
1
falls v = u.
Diese Abbildung ist eine topologische Ordnung, denn für alle Kanten
(v , v ′ ) mit v , v ′ 6= u gilt ord(v ) = ord′ (v ) + 1 < ord′ (v ′ ) + 1 = ord(v ′ )
und für alle Kanten (u, v ) gilt ord(u) = 1 < 2 ≤ ord′ (v ) + 1 = ord(v ).
Kanten der Form (v , u) gibt es nicht, da din (u) = 0.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
22 / 26
Graphtraverse
Beweis (Existenz von topologischen Ordnung (Fortsetzung))
Damit müssen wir irgendwann auf einen Knoten u stoßen, der keinen
Nachfolger besitzt, d.h. din (u) = 0.
Sei nun G ′ = G − u. Offensichtlich ist G ′ azyklisch und somit existiert
nach Induktionsvoraussetzung eine topologische Ordnung
ord′ : V \ {u} → {1, . . . , n − 1} von G ′ .
Auf G definieren wir ord : V → {1, . . . , n} als
(
ord′ (v ) + 1 falls v 6= u
ord(v ) :=
1
falls v = u.
Diese Abbildung ist eine topologische Ordnung, denn für alle Kanten
(v , v ′ ) mit v , v ′ 6= u gilt ord(v ) = ord′ (v ) + 1 < ord′ (v ′ ) + 1 = ord(v ′ )
und für alle Kanten (u, v ) gilt ord(u) = 1 < 2 ≤ ord′ (v ) + 1 = ord(v ).
Kanten der Form (v , u) gibt es nicht, da din (u) = 0.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
22 / 26
Graphtraverse
Die Existenz einer topologischen Ordnung
Der vorangegangene Beweis ist bereits ein Algorithmus zur Konstruktion
einer topologischen Ordnung.
Allerdings würde die Suche eines Knotens u mit din (u) = 0 nach dem
obigen Verfahren im schlechtesten Fall O(n) Zeit kosten. Dadurch ergibt
sich eine Gesamtlaufzeit von O(n2 ).
Stattdessen werden wir stets eine Liste aller Knoten mit verbliebenen
Eingangsgrad 0 mitführen.
Dazu werden wir jedesmal, wenn ein Knoten ohne Vorgänger entnommen
wird, den Grad seiner Nachfolger entsprechend herabsetzen.
Wie man leicht sieht führen wir im Prinzip eine modifizierte Breitensuche
durch, bei der wir die Knoten in der Reihenfolge nummerieren, wie wir sie
besuchen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
23 / 26
Graphtraverse
Die Existenz einer topologischen Ordnung
Der vorangegangene Beweis ist bereits ein Algorithmus zur Konstruktion
einer topologischen Ordnung.
Allerdings würde die Suche eines Knotens u mit din (u) = 0 nach dem
obigen Verfahren im schlechtesten Fall O(n) Zeit kosten. Dadurch ergibt
sich eine Gesamtlaufzeit von O(n2 ).
Stattdessen werden wir stets eine Liste aller Knoten mit verbliebenen
Eingangsgrad 0 mitführen.
Dazu werden wir jedesmal, wenn ein Knoten ohne Vorgänger entnommen
wird, den Grad seiner Nachfolger entsprechend herabsetzen.
Wie man leicht sieht führen wir im Prinzip eine modifizierte Breitensuche
durch, bei der wir die Knoten in der Reihenfolge nummerieren, wie wir sie
besuchen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
23 / 26
Graphtraverse
Die Existenz einer topologischen Ordnung
Der vorangegangene Beweis ist bereits ein Algorithmus zur Konstruktion
einer topologischen Ordnung.
Allerdings würde die Suche eines Knotens u mit din (u) = 0 nach dem
obigen Verfahren im schlechtesten Fall O(n) Zeit kosten. Dadurch ergibt
sich eine Gesamtlaufzeit von O(n2 ).
Stattdessen werden wir stets eine Liste aller Knoten mit verbliebenen
Eingangsgrad 0 mitführen.
Dazu werden wir jedesmal, wenn ein Knoten ohne Vorgänger entnommen
wird, den Grad seiner Nachfolger entsprechend herabsetzen.
Wie man leicht sieht führen wir im Prinzip eine modifizierte Breitensuche
durch, bei der wir die Knoten in der Reihenfolge nummerieren, wie wir sie
besuchen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
23 / 26
Graphtraverse
Die Existenz einer topologischen Ordnung
Der vorangegangene Beweis ist bereits ein Algorithmus zur Konstruktion
einer topologischen Ordnung.
Allerdings würde die Suche eines Knotens u mit din (u) = 0 nach dem
obigen Verfahren im schlechtesten Fall O(n) Zeit kosten. Dadurch ergibt
sich eine Gesamtlaufzeit von O(n2 ).
Stattdessen werden wir stets eine Liste aller Knoten mit verbliebenen
Eingangsgrad 0 mitführen.
Dazu werden wir jedesmal, wenn ein Knoten ohne Vorgänger entnommen
wird, den Grad seiner Nachfolger entsprechend herabsetzen.
Wie man leicht sieht führen wir im Prinzip eine modifizierte Breitensuche
durch, bei der wir die Knoten in der Reihenfolge nummerieren, wie wir sie
besuchen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
23 / 26
Graphtraverse
Die Existenz einer topologischen Ordnung
Der vorangegangene Beweis ist bereits ein Algorithmus zur Konstruktion
einer topologischen Ordnung.
Allerdings würde die Suche eines Knotens u mit din (u) = 0 nach dem
obigen Verfahren im schlechtesten Fall O(n) Zeit kosten. Dadurch ergibt
sich eine Gesamtlaufzeit von O(n2 ).
Stattdessen werden wir stets eine Liste aller Knoten mit verbliebenen
Eingangsgrad 0 mitführen.
Dazu werden wir jedesmal, wenn ein Knoten ohne Vorgänger entnommen
wird, den Grad seiner Nachfolger entsprechend herabsetzen.
Wie man leicht sieht führen wir im Prinzip eine modifizierte Breitensuche
durch, bei der wir die Knoten in der Reihenfolge nummerieren, wie wir sie
besuchen.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
23 / 26
Graphtraverse
Algorithmus (Topologische Ordnung)
Eingabe: Ein gerichteter Graph G = (V , E ).
Ausgabe: Eine topologische Ordnung ord auf G , falls G azyklisch ist.
Daten: Integer-Felder in[1 . . . n] und ord[1 . . . n] und eine Knoten-Liste L.
für v := 1 . . . n tue
in[v ] := din [v ]
wenn in[v ] = 0 dann L := (L, v )
Ende
o := 0
solange L 6= ∅ tue
Entnehme ein v aus L
o := o + 1, ord[v ] := o
für e = (v , u) ∈ out(v ) tue
in[u] := in[u] − 1
wenn in[u] = 0 dann L := (L, u)
Ende
Ende
wenn o = n dann gebe aus: G ist azyklisch“
”
sonst gebe aus: G ist nicht azyklisch“
”
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
24 / 26
Graphtraverse
Die Laufzeit
Verwendet man Adjazenzlisten für die Darstellung von G , ergeben sich die
Laufzeiten für die einzelnen Phasen folgendermaßen:
1
Die Initialisierung benötigt O(|V | + |E |), um die Eingangsgrade zu
bestimmen und die Liste zu füllen.
2
Die Schleife wird höchstens |V |-mal durchlaufen, da ein Knoten erst
behandelt wird, wenn alle seine Vorgänger bereits bearbeitet worden
sind. Dadurch kann er später nicht wieder in die Liste L eingefügt
werden.
3
Innerhalb der schleife wird jede Kante höchstens einmal betrachtet.
dies geschieht genau dann, wenn ihr Startknoten gerade bearbeitet
wird.
4
Damit ergibt sich die Laufzeit für die Schleife als O(|V | + |E |).
5
der Abschließende Test benötigt O(1).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
25 / 26
Graphtraverse
Die Laufzeit
Verwendet man Adjazenzlisten für die Darstellung von G , ergeben sich die
Laufzeiten für die einzelnen Phasen folgendermaßen:
1
Die Initialisierung benötigt O(|V | + |E |), um die Eingangsgrade zu
bestimmen und die Liste zu füllen.
2
Die Schleife wird höchstens |V |-mal durchlaufen, da ein Knoten erst
behandelt wird, wenn alle seine Vorgänger bereits bearbeitet worden
sind. Dadurch kann er später nicht wieder in die Liste L eingefügt
werden.
3
Innerhalb der schleife wird jede Kante höchstens einmal betrachtet.
dies geschieht genau dann, wenn ihr Startknoten gerade bearbeitet
wird.
4
Damit ergibt sich die Laufzeit für die Schleife als O(|V | + |E |).
5
der Abschließende Test benötigt O(1).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
25 / 26
Graphtraverse
Die Laufzeit
Verwendet man Adjazenzlisten für die Darstellung von G , ergeben sich die
Laufzeiten für die einzelnen Phasen folgendermaßen:
1
Die Initialisierung benötigt O(|V | + |E |), um die Eingangsgrade zu
bestimmen und die Liste zu füllen.
2
Die Schleife wird höchstens |V |-mal durchlaufen, da ein Knoten erst
behandelt wird, wenn alle seine Vorgänger bereits bearbeitet worden
sind. Dadurch kann er später nicht wieder in die Liste L eingefügt
werden.
3
Innerhalb der schleife wird jede Kante höchstens einmal betrachtet.
dies geschieht genau dann, wenn ihr Startknoten gerade bearbeitet
wird.
4
Damit ergibt sich die Laufzeit für die Schleife als O(|V | + |E |).
5
der Abschließende Test benötigt O(1).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
25 / 26
Graphtraverse
Die Laufzeit
Verwendet man Adjazenzlisten für die Darstellung von G , ergeben sich die
Laufzeiten für die einzelnen Phasen folgendermaßen:
1
Die Initialisierung benötigt O(|V | + |E |), um die Eingangsgrade zu
bestimmen und die Liste zu füllen.
2
Die Schleife wird höchstens |V |-mal durchlaufen, da ein Knoten erst
behandelt wird, wenn alle seine Vorgänger bereits bearbeitet worden
sind. Dadurch kann er später nicht wieder in die Liste L eingefügt
werden.
3
Innerhalb der schleife wird jede Kante höchstens einmal betrachtet.
dies geschieht genau dann, wenn ihr Startknoten gerade bearbeitet
wird.
4
Damit ergibt sich die Laufzeit für die Schleife als O(|V | + |E |).
5
der Abschließende Test benötigt O(1).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
25 / 26
Graphtraverse
Die Laufzeit
Verwendet man Adjazenzlisten für die Darstellung von G , ergeben sich die
Laufzeiten für die einzelnen Phasen folgendermaßen:
1
Die Initialisierung benötigt O(|V | + |E |), um die Eingangsgrade zu
bestimmen und die Liste zu füllen.
2
Die Schleife wird höchstens |V |-mal durchlaufen, da ein Knoten erst
behandelt wird, wenn alle seine Vorgänger bereits bearbeitet worden
sind. Dadurch kann er später nicht wieder in die Liste L eingefügt
werden.
3
Innerhalb der schleife wird jede Kante höchstens einmal betrachtet.
dies geschieht genau dann, wenn ihr Startknoten gerade bearbeitet
wird.
4
Damit ergibt sich die Laufzeit für die Schleife als O(|V | + |E |).
5
der Abschließende Test benötigt O(1).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
25 / 26
Graphtraverse
Die Laufzeit
Verwendet man Adjazenzlisten für die Darstellung von G , ergeben sich die
Laufzeiten für die einzelnen Phasen folgendermaßen:
1
Die Initialisierung benötigt O(|V | + |E |), um die Eingangsgrade zu
bestimmen und die Liste zu füllen.
2
Die Schleife wird höchstens |V |-mal durchlaufen, da ein Knoten erst
behandelt wird, wenn alle seine Vorgänger bereits bearbeitet worden
sind. Dadurch kann er später nicht wieder in die Liste L eingefügt
werden.
3
Innerhalb der schleife wird jede Kante höchstens einmal betrachtet.
dies geschieht genau dann, wenn ihr Startknoten gerade bearbeitet
wird.
4
Damit ergibt sich die Laufzeit für die Schleife als O(|V | + |E |).
5
der Abschließende Test benötigt O(1).
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
25 / 26
Graphtraverse
Die Laufzeit ist somit klar. Aber wie sieht es mit der Korrektheit aus?
Zuerst beobachten wir, dass ein Knoten v , der auf einem Kreis
(v , v1 , . . . , vl−1 , v ) liegt, nie zur Liste L hinzugefügt wird. Damit dies
geschehen würde, müssten sämtliche seiner Vorgänger bereits besucht
worden sein, d.h. auch vl−1 . Dafür müsste aber wiederrum vl−2 usw. bis v1
und schließlich v selbst bereits besucht sein.
Damit besucht der Algorithmus nur Knoten, die auf keinem Kreis liegen.
Für diese wird außerdem offensichtlich eine topologische Ordnung
konstruiert.
Satz
Der Algorithmus testet in Zeit O(|V | + |E |), ob ein gerichteter Graph
azyklisch ist. Gleichzeitig konstruiert er eine topologischen Ordnung, wenn
möglich.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
26 / 26
Graphtraverse
Die Laufzeit ist somit klar. Aber wie sieht es mit der Korrektheit aus?
Zuerst beobachten wir, dass ein Knoten v , der auf einem Kreis
(v , v1 , . . . , vl−1 , v ) liegt, nie zur Liste L hinzugefügt wird. Damit dies
geschehen würde, müssten sämtliche seiner Vorgänger bereits besucht
worden sein, d.h. auch vl−1 . Dafür müsste aber wiederrum vl−2 usw. bis v1
und schließlich v selbst bereits besucht sein.
Damit besucht der Algorithmus nur Knoten, die auf keinem Kreis liegen.
Für diese wird außerdem offensichtlich eine topologische Ordnung
konstruiert.
Satz
Der Algorithmus testet in Zeit O(|V | + |E |), ob ein gerichteter Graph
azyklisch ist. Gleichzeitig konstruiert er eine topologischen Ordnung, wenn
möglich.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
26 / 26
Graphtraverse
Die Laufzeit ist somit klar. Aber wie sieht es mit der Korrektheit aus?
Zuerst beobachten wir, dass ein Knoten v , der auf einem Kreis
(v , v1 , . . . , vl−1 , v ) liegt, nie zur Liste L hinzugefügt wird. Damit dies
geschehen würde, müssten sämtliche seiner Vorgänger bereits besucht
worden sein, d.h. auch vl−1 . Dafür müsste aber wiederrum vl−2 usw. bis v1
und schließlich v selbst bereits besucht sein.
Damit besucht der Algorithmus nur Knoten, die auf keinem Kreis liegen.
Für diese wird außerdem offensichtlich eine topologische Ordnung
konstruiert.
Satz
Der Algorithmus testet in Zeit O(|V | + |E |), ob ein gerichteter Graph
azyklisch ist. Gleichzeitig konstruiert er eine topologischen Ordnung, wenn
möglich.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
26 / 26
Graphtraverse
Die Laufzeit ist somit klar. Aber wie sieht es mit der Korrektheit aus?
Zuerst beobachten wir, dass ein Knoten v , der auf einem Kreis
(v , v1 , . . . , vl−1 , v ) liegt, nie zur Liste L hinzugefügt wird. Damit dies
geschehen würde, müssten sämtliche seiner Vorgänger bereits besucht
worden sein, d.h. auch vl−1 . Dafür müsste aber wiederrum vl−2 usw. bis v1
und schließlich v selbst bereits besucht sein.
Damit besucht der Algorithmus nur Knoten, die auf keinem Kreis liegen.
Für diese wird außerdem offensichtlich eine topologische Ordnung
konstruiert.
Satz
Der Algorithmus testet in Zeit O(|V | + |E |), ob ein gerichteter Graph
azyklisch ist. Gleichzeitig konstruiert er eine topologischen Ordnung, wenn
möglich.
Dr. Michael Brinkmeier (TU Ilmenau)
Algorithmen und Datenstrukturen
11.7.2007
26 / 26
Herunterladen