Platzhalter für Bild, Bild auf Titelfolie hinter das Logo einsetzen Algorithmen und Datenstrukturen Übung #4 BFS/DFS, Wachstum von Funktionen Christian Rieck, Arne Schmidt 22.11.2018
Heute 12 Breiten- und Tiefensuche e n Wachstum von Funktionen 9 n 2 Größe des Inputs 6 Definitionen (O-Notation) Relationen zwischen Laufzeitklassen 3 n n Beispiele für Laufzeitklassen -3 Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 2 0 0 0,5 1 1,5 2 2,5 3 log n log log n
Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 3 1: https://idea-instructions.com/graph-scan/
Breitensuche Benutze Warteschlange Prinzip: First-in-first-out v 1 v 3 v 2 v 4 v 6 v 5 v 7 v 1 v 1, v 2 v 1, v 2, v 3 v 2, v 3 v 2, v 3, v 5 v 2, v 3, v 5, v 6 v 3, v 5, v 6 v 3, v 5, v 6, v 4 v 5, v 6, v 4 v 5, v 6, v 4, v 7 v 6, v 4, v 7 v 4, v 7 v 7 v 1 v 3 v 2 v 4 v 6 v 5 v 7 Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 4
Tiefensuche Benutze Stapel Prinzip: Last-in-first-out v 1 v 3 v 2 v 4 v 6 v 5 v 7 v 1 v 1, v 2 v 1, v 2, v 5 v 1, v 2, v 5, v 3 v 1, v 2, v 5, v 3, v 4 v 1, v 2, v 5, v 3 v 1, v 2, v 5 v 1, v 2, v 5, v 7 v 1, v 2, v 5, v 7, v 6 v 1, v 2, v 5, v 7 v 1, v 2, v 5 v 1, v 2 v 1 v 1 v 3 v 2 v 4 v 6 v 5 v 7 Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 5
Tiefensuche Benutze Stapel Prinzip: Last-in-first-out v 1 v 1, v 2 v 1, v 2, v 5 v 1, v 2, v 5, v 3 v 1 v 3 v 2 v 4 v 6 v 5 v 7 v 1, v 2, v 5, v 3, v 4 v 1, v 2, v 5, v 3 v 1, v 2, v 5 v 1, v 2, v 5, v 7 v 1, v 2, v 5, v 7, v 6 v 1, v 2, v 5, v 7 v 1, v 2, v 5 v 1, v 2 v 1 Beliebte Fehler: Leere Menge am Ende vergessen Nicht jede Änderung angegeben Suchbaum nicht angegeben Nicht den kleinsten Index beachtet v 1 v 3 v 2 v 4 v 6 v 5 v 7 Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 5
Six Degrees of Kevin Bacon vs. Six Degrees of Wikipedia Finde kürzesten Weg von einem Schauspieler über Filme zu Kevin Bacon Ungerichteter Graph Hin- und Rückweg sind gleich lang Finde kürzesten Weg von einer Seite über enthaltene Links zu einer anderen Gerichteter Graph Hin- und Rückweg sind verschieden lang Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 6
Weitere Problem mit BFS/DFS Eindeutigkeitsproblem Algorithmen besitzen feste Regeln, nach denen Objekte abgearbeitet werden (z.b. Knoten mit kleinstem Index zuerst). Auf welchen Graphen wird der erhaltene BFS/DFS-Baum eindeutig, wenn uns die Regel egal ist? Also: Gegeben: Graph G und Knoten v Frage: Ist der BFS(/DFS)-Baum von G eindeutig, wenn man bei v startet? Satz: DFS-Baum ist genau dann eindeutig, wenn G ein Baum ist. Beweis: : Angenommen G besitzt einen Kreis. Dann können wir bei Erreichen des Kreises den Baum links oder recht herum aufbauen. Der DFS-Baum ist nicht eindeutig. Widerspruch! : Wenn G ein Baum ist, ist auch der DFS-Baum ebendieser Graph. oder Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 7
Eindeutiger BFS-Baum Wie sieht ein Graph aus, bei dem der BFS-Baum eindeutig ist? Satz: Der BFS-Baum ist eindeutig genau dann, wenn der kürzeste Pfad von v zu allen anderen Knoten eindeutig ist. Distanz h Distanz 2 Distanz 1 Beweis: Selbst! Alle Knoten auf gleichen Distanzebenen dürfen miteinander verbunden sein! Distanz 0 Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 8
Labyrinthe BFS?! Da kommen wir doch nie an! Ich benutze DFS! Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 9 Die Reise ins Labyrinth, 1986 https://fictionmachine.com/2015/07/03/everything-ive-done-ive-done-for-you-labyrinth-1985/
Zeit für ein Labyrinth Wie oft muss man durch die Gänge des Labyrinths laufen, wenn man 1. DFS, oder 2. BFS nutzt? 2. BFS: Worst-Case: Ω n 2 mal über Kanten laufen! DFS schafft das schneller! Frage: Ist DFS auf jedem Baum/Labyrinth schneller? Man kann zeigen: Jede Kante wird maximal zwei Mal benutzt. Man benötigt maximal 2n-1 Schritte Es gibt Bäume, bei denen 2n-1 Schritte benötigt werden Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 10
Überblick Breiten- und Tiefensuche Wachstum von Funktionen Größe des Inputs Definitionen (O-Notation) Relationen zwischen Laufzeitklassen Beispiele für Laufzeitklassen Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 11
Wachstum von Funktionen / Laufzeiten Wie lange benötigen Algorithmen? Absolute/Genaue Laufzeit ist nicht immer nötig Abschätzen: In welcher Ordnung wächst die Laufzeit? Wovon hängt die Laufzeit ab? Was ist gegeben? (Zahlen, Strings, Graphen, ) Wie viel ist gegeben? (Codierungsgröße) Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 12
Codierungsgröße - Zahlen Wie können Zahlen codiert werden? 1. Unär ( Bierdeckelnotation ) 2. b-adisch Dezimal (10-adisch) Gewöhnlich für Zahlen: Binäre Darstellung, d.h. eine Zahl belegt log 2 n bits. Binär (2-adisch) m Allgemein: a m a m 1 a 1 a 0, a 1 a 2 a wobei n = σ i= a i b i und 0 a < b Beispiele: Dezimal Unär Binär Oktal Hexadezimal 27 IIII IIII IIII IIII IIII II 11011 33 1B Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 13
Codierungsgröße - Graphen Wie kann man Graphen speichern? Adjazenzmatrix: Adjazenzliste: v 4 0 1 1 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 v 1 : v 2, v 3 v 2 : v 1, v 5, v 6 v 3 : v 1, v 4, v 5 v 4 : v 3 v 5 : v 2, v 3, v 7 v 6 : v 2, v 7 v 7 : v 5, v 6 v 1 v 3 v 2 v 6 v 5 v 7 Größe: V 2 V + E log V Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 14
Codierungsgröße - Sonstige Was gibt es noch? Zeichenketten/Strings S: S log N für N mögliche Zeichen. (>o.o)>das_ist_ein_string!! ( o ) Punktmenge P in d Dimensionen: d P log N, wobei N die größte Koordinate ist. n m-matrizen: n m log N, wobei N der größtmögliche Wert ist. 5 12 1 6 22 5 0 42 21 Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 15
Überblick Breiten- und Tiefensuche Wachstum von Funktionen Größe des Inputs Definitionen (O-Notation) Relationen zwischen Laufzeitklassen Beispiele für Laufzeitklassen Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 16
Wachstum von Funktionen Betrachte Laufzeit als Funktion T: N R + Verschiedene Systeme liefern verschiedene Laufzeiten, z.b. T 1 n und T 2 n. Aber: T 1 n und T 2 n wachsen ähnlich schnell T 1 n wächst höchstens c 1 mal so schnell wie T 2. T 1 n wächst mindestens c 2 mal so schnell wie T 2. Das gilt ggf. erst ab einem bestimmten Punkt, nämlich n 0 Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 17 n 0 c 1 T 2 n T 1 n c 2 T 2 n n
Landau-Symbole Das motiviert folgende Definitionen: O-Notation: Es gibt Konstanten n 0 N und c 1 R +, sodass für alle n n 0 gilt: T 1 n c 1 T 2 n T 1 n O T 2 n Ω-Notation: Es gibt Konstanten n 0 N und c 2 R +, sodass für alle n n 0 gilt: T 1 n c 2 T 2 n T 1 n Ω T 2 n Achtung: O, Ω und Θ sind Mengen! Θ-Notation: Es gibt Konstanten n 0 N und c 1, c 2 R +, sodass für alle n n 0 gilt: c 2 T 2 n T 1 n c 1 T 2 n T 1 n Θ T 2 n Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 18
Beispiel Funktionen Zeige: n O n 2 Mit c = 1 und n 0 = 1 gilt die Aussage wie rechts zu sehen. 12 9 e n n 2 6 3 n n Vorsicht: Es muss eine Allaussage bewiesen/widerlegt werden Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 19 0-3 0 0,5 1 1,5 2 2,5 3 log n 1: https://media1.tenor.com/images/2b6d254d7bbdfd42583e6080ac327d0f/tenor.gif?itemid=5268083 log log n
Überblick Breiten- und Tiefensuche Wachstum von Funktionen Größe des Inputs Definitionen (O-Notation) Relationen zwischen Laufzeitklassen Beispiele für Laufzeitklassen Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 20
Relationen zwischen Klassen - Eine graphische Darstellung Ω g n Θ g n g n Größere Funktionen Wir können sogar Klassen miteinander vergleichen. Beispiel: Ω(n) und Θ n 2 Wir sehen, jede Funktion, die in Θ n 2 liegt, liegt auch in Ω n. Die Umkehrung gilt nicht! Also Θ n 2 Ω(n) Ω n 2 Θ n 2 Ω n n 4 n 3 n 2 O g n 0 Kleinere Funktionen Zum Merken: Wird die Funktion größer, wächst der O-Bereich und der Ω-Bereich schrumpft. O n 2 Θ n O n 0 n 1 Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 21
Relationen zwischen Klassen Eine Tabelle Bedingung f n o g n o g n O g n Θ g n Klein-o-Notation f n Θ g n Klasse O g n Θ g n Ω g n Klasse O f n X X Θ f n X X Ω f n X O f n = X Θ f n = Ω f n X = f n ω g n ω g n Ω g n Θ g n Klein-ω-Notation O f n X Θ f n X X Ω f n X X Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 22
Heute Breiten- und Tiefensuche Wachstum von Funktionen Größe des Inputs Definitionen (O-Notation) Relationen zwischen Laufzeitklassen Beispiele für Laufzeitklassen Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 23
Ab an die Tafel! Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 24
Beispiel 1 Zeige 4n 2 + 12n 15 Θ n 2. D.h.: Bestimme n 0, c 1, c 2, sodass für alle n n 0 gilt: 0 c 1 n 2 4n 2 + 12n 15 c 2 n 2 1. Suche nach c 2 : 4n 2 + 12n 15 4n 2 + 12n 4n 2 + 12n 2 = 16n 2 für n 1. 2. Suche nach c 1 : n 4 4n 2 + 12n 15 4n 2 15 ฎ 4n 2 n 2 = 3n 2 für n 4. Beide Ungleichung gelten ab n 0 = 4. Also c 1 = 3, c 2 = 16 und n 0 = 4. Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 25
Beispiel 2 Zeige oder widerlege: 2 n Θ 3 n Zunächst: 2 n O 3 n, denn 2 n 2 + 1 n = 3 n. Aber: 2 n Ω 3 n! Ansonsten gäbe es eine Konstante c 1 mit Aber: 2n = 2 n 2 und lim 3 n 3 n 3 Aussage widerlegt. 2 n c 1 3 n, also 2n c 3 n 1 n = 0, d.h. dieses c1 kann nicht existieren! Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 26
Beispiel 3 Satz 3.1: Für jedes c > 0 gibt es ein n 0, sodass für alle n n 0 gilt: log 2 n c n log Beweisidee: Zeige, dass lim 2 n = 0, d.h. für wachsendes n kommen wir beliebig nah an 0 heran. D.h. n n wir können n 0 so wählen, dass log 2 n c für alle n n n 0 gilt. Satz 3.2: Seien a, b R +. Dann gilt log 2 a n O n b. Beweis: Wählen wir die Konstante c = 1. Dann soll gelten: log 2 a n n b m log 2 n ฏ log 2 log a 2 n log 2 n b a log 2 log 2 n b log 2 n log 2 m b a m Da a, b R + ist auch b a R+. Nach Satz 3.1 ist die letzte Ungleichung ab einem n 0 wahr. Da wir Äquivalenzumformungen benutzt haben, können wir die Lösungkette von unten nach oben gehen. Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 27
Beispiel 4: Laufzeit eines Algorithmus PrimFaktor n 1. Sei i = 2 2. While i n 3. if n mod i = 0 then 4. n = n i 5. output i 6. else 7. i = i + 1 Man sieht: Zeilen 1 und 3-7 dauern konstant lange. While-Schleife benötigt höchstens n Iterationen (da entweder i größer oder n kleiner wird) Damit: O 1 + O n O 1 = O n Lineare Laufzeit! Oder? Input besitzt Größe m log 2 n. Damit hat der Algorithmus eine Laufzeit von: O n = O 2 log 2 n = O 2 m Das ist exponentielle Laufzeit. Schnellster, bisher bekannter Algorithmus für die Primfaktorzerlegung ist der Zahlkörpersieb. Seine Laufzeit ist: e O 1 m 1 3 log m 1 3 Christian Rieck, Arne Schmidt Graphenscan, Wachstum Seite 28