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