Algorithmen I Prof. Jörn Müller-Quade 19.06.2017 Institut für Theoretische Informatik Web: https://crypto.iti.kit.edu/index.php?id=799 (Folien von Peter Sanders) KIT Institut für Theoretische Informatik 1
Tiefensuche cross backward tree forward s b e g f d c KIT Institut für Theoretische Informatik 2
Tiefensuchschema für G = (V,E) unmark all nodes; init foreach s V do if s is not marked then mark s root(s) DFS(s, s) // make s a root and grow // a new DFS tree rooted at s Procedure DFS(u,v : NodeId) // Explore v coming from u foreach (v,w) E do if w is marked then traversenontreeedge(v, w) else traversetreeedge(v, w) mark w DFS(v,w) backtrack(u,v) // return from v along the incoming edge KIT Institut für Theoretische Informatik 3
DFS-Baum init: root(s): traversetreeedge(v, w): parent=,..., : NodeArray of NodeId parent[s]:= s parent[w]:= v tree parent mark s d root(s) dfs(s,s) traversetreeedge(s,b) mark b dfs(s,b) s b s b e g f d c e g f c KIT Institut für Theoretische Informatik 4
dfs(s,b) traversetreeedge(b,e) mark(e) dfs(b,e) traversetreeedge(e,g) mark(g) dfs(e,g) traversenontreeedge(g,b) traversetreeedge(g,f) mark(f) dfs(g,f) backtrack(g,f) backtrack(e,g) traversenontreeedge(e,f) traversetreeedge(e,c) mark(c) dfs(e,c) backtrack(e,c) backtrack(b,e) backtrack(s,b) s b e g f d c s b e g f d c s b e g f d c s b e g f d c KIT Institut für Theoretische Informatik 5
traversetreeedge(s,d) mark(d) dfs(s,d) traversenontreeedge(d,e) traversenontreeedge(d,f) backtrack(s,d) backtrack(s,s) s b e g f d c s b e g f d c KIT Institut für Theoretische Informatik 6
DFS-Nummerierung init: root(s): traversetreeedge(v, w): dfspos=1 : 1..n dfsnum[s]:= dfspos++ dfsnum[w]:= dfspos++ u v : dfsnum[u] < dfsnum[v]. Beobachtung: Knoten auf dem Rekursionsstapel sind bzgl. sortiert tree 1 2 3 4 5 backward s b e g f cross forward d c 7 6 KIT Institut für Theoretische Informatik 7
Fertigstellungszeit init: backtrack(u, v): nishingtime=1 : 1..n nishtime[v]:= nishingtime++ tree 7 5 4 2 1 backward s b e g f cross forward d c 6 3 KIT Institut für Theoretische Informatik 8
Kantenklassizierung bei DFS type dfsnum[v] < nishtime[w] < w is (v, w) dfsnum[w] nishtime[v] marked tree yes yes no forward yes yes yes backward no no yes cross no yes yes forward s tree backward cross KIT Institut für Theoretische Informatik 9
Topologische Sortierung Denition 1 Eine lineare Anordnung t der Knoten eines DAGs G = (V,E), in der alle Kanten von kleineren zu gröÿeren Knoten verlaufen, heiÿt topologische Sortierung, d. h. (u,v) E : t(u) < t(v). Beispiel: topologisch sortierter Kleidergraph, Quelle: Wikipedia Kleidergraph, Quelle: Wikipedia KIT Institut für Theoretische Informatik 10
Topologisches Sortieren mittels DFS Theorem 2 G ist kreisfrei (DAG) DFS ndet keine Rückwärtskante. In diesem Fall liefert t(v):= n nishtime[v] eine topologische Sortierung. KIT Institut für Theoretische Informatik 11
Topologisches Sortieren mittels DFS Theorem 2 G ist kreisfrei (DAG) DFS ndet keine Rückwärtskante. In diesem Fall liefert t(v):= n nishtime[v] eine topologische Sortierung. Beweis : Annahme: Rückwärtskante. Zusammen mit Baumkanten ergibt sich ein Kreis. Widerspruch. forward s tree backward cross KIT Institut für Theoretische Informatik 11
Topologisches Sortieren mittels DFS Satz: G kreisfrei (DAG) DFS ndet keine Rückwärtskante. In diesem Fall liefert t(v):= n nishtime[v] eine topologische Sortierung, d. h. (u,v) E : t(u) < t(v). Beweis : Keine Rückwärtskante Kantenklassizierung {}}{ (v,w) E : nishtime[v] > nishtime[w] G ist kreisfrei und nishtime deniert umgekehrte topologische Sortierung. KIT Institut für Theoretische Informatik 12
Starke Zusammenhangskomponenten Betrachte die Relation mit u v falls Pfad u,...,v und Pfad v,...,u. Beobachtung: ist Äquivalenzrelation Die Äquivalenzklassen von bezeichnet man als starke Zusammenhangskomponenten. Übung DFS-basierter Linearzeitalgorithmus Algorithmen II KIT Institut für Theoretische Informatik 13
Mehr DFS-basierte Linearzeitalgorithmen 2-zusammenhängende Komponenten: bei Entfernen eines Knotens aus einer Komponente bleibt diese zusammenhängend (ungerichtet) 3-zusammenhängende Komponenten Planaritätstest (lässt sich der Graph kreuzungsfrei zeichnen?) Einbettung planarer Graphen KIT Institut für Theoretische Informatik 14
BFS DFS pro BFS: nichtrekursiv keine Vorwärtskanten kürzeste Wege, Umgebung pro DFS: keine explizite Datenstruktur (Rekursionsstapel) für ToDos, daher mglw. einfacher Grundlage vieler Algorithmen s tree forward backward cross KIT Institut für Theoretische Informatik 15
Kap. 10: Kürzeste Wege Eingabe: Graph G = (V,E) mit Kostenfunktion/Kantengewicht c : E R sowie Startknoten s. 3.0 km Ausgabe: für alle v V : Länge µ(v) des kürzesten Pfades von s nach v, µ(v) := min{c(p) : p ist Pfad von s nach v} mit c( e 1,...,e k ) := k i=1 c(e i). KIT Institut für Theoretische Informatik 16
Kap. 10: Kürzeste Wege Eingabe: Graph G = (V,E) mit Kostenfunktion/Kantengewicht c : E R sowie Startknoten s. 3.0 km Ausgabe: für alle v V : Länge µ(v) des kürzesten Pfades von s nach v, µ(v) := min{c(p) : p ist Pfad von s nach v} mit c( e 1,...,e k ) := k i=1 c(e i). Oft wollen wir auch geeignete Repräsentation der kürzesten Pfade. KIT Institut für Theoretische Informatik 16
Anwendungen Routenplanung Straÿennetze Spiele Kommunikationsnetze Unterprogramm Flüsse in Netzwerken... Tippfehlerkorrektur Disk Scheduling 3.0 km... KIT Institut für Theoretische Informatik 17
Grundlagen Gibt es immer einen kürzesten Pfad? Es kann negative Kreise geben! s p u C q v s p u C (2) q v... weitere Grundlagen just in time KIT Institut für Theoretische Informatik 18
Azyklische Graphen später KIT Institut für Theoretische Informatik 19
Kantengewichte 0 Alle Gewichte gleich: Breitensuche (BFS)! s b c d e f g tree backward cross forward 0 1 2 3 KIT Institut für Theoretische Informatik 20
Dijkstras Algorithmus Nun: Beliebige nichtnegative Kantengewichte Lösung ohne Rechner: M R 0 Distance to M 5 Kanten Fäden Kantengewicht Fadenlänge Knoten Knoten Dann: Am Startknoten anheben. H G F E C N K L P V Q S O J W 11 13 15 17 17 18 19 20 KIT Institut für Theoretische Informatik 21
Korrektheit der Bindfäden Betrachte beliebigen Knoten v mit Hängetiefe d[v]. Pfad mit Hängetiefe: verfolge strae Fäden kürzerer Pfad: falls es einen solchen Pfad gäbe, wäre einer seiner Fäden zerrissen! H G F E C M N K L P V R Q S O J W 0 Distance to M 5 11 13 15 17 17 18 19 20 KIT Institut für Theoretische Informatik 22
Edsger Wybe Dijkstra 19302002 1972 ACM Turing Award THE: das erste Mulitasking-OS Semaphor Selbst-stabilisierende Systeme GOTO Statement Considered Harmful Bildquelle: Wikipedia KIT Institut für Theoretische Informatik 23
Allgemeine Denitionen Wie bei BFS benutzen wir zwei Knotenarrays: d[v] = aktuelle (vorläuge) Distanz von s nach v Invariante: d[v] µ(v) parent[v] = Vorgänger von v auf dem (vorläugen) kürzesten Pfad von s nach v Invariante: dieser Pfad bezeugt d[v] Initialisierung: d[s] = 0, parent[s] = s d[v] =, parent[v] = s Kante Kante Kante v parent parent parent d[v] KIT Institut für Theoretische Informatik 24
Kante (u,v) relaxieren Falls d[u] + c(u,v) < d[v] (vielleicht d[v] = ), setze d[v] := d[u] + c(u,v) und parent[v] := u Invarianten bleiben erhalten! Beobachtung: d[v] kann sich mehrmals ändern! KIT Institut für Theoretische Informatik 25
Dijkstras Algorithmus: Pseudocode initialize d, parent all nodes are non-scanned while non-scanned node u with d[u] < u := non-scanned node v with minimal d[v] relax all edges (u,v) out of u u is scanned now Behauptung: Am Ende deniert d die optimalen Entfernungen und parent die zugehörigen Wege KIT Institut für Theoretische Informatik 26