Tag 18 Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik 09.09.2009
Agenda Tag 16 Datenstrukturen Abstrakte Datentypen, ADT Folge: Stack, Queue, Liste, ADT Menge: Bäume: Binärbäume, Suchbäume, AVL-Bäume, Prioritätswarteschlangen, Heap, Graphen ADTs in Java Tag 17 Sortieralgorithmen InsertionSort, BubbleSort, SelectionSort, ShellSort, MergeSort, QuickSort, Binary Tree Sort, HeapSort Untere Schranke für vergleichsbasierte Sortierverfahren, BucketSort, CountingSort, RadixSort Tag 18 Suchalgorithmen Binärsuche, Breitensuche, Tiefensuche, Backtracking Klausurvorbereitung Tag 19 Klausur Tag 20 Letzter Tag Weitere Projekte am Fachbereich, Klausurnachbesprechung, Grillen? 3
Suchalgorithmen Suchen und Sortieren sind zwei Grunddisziplinen der Informatik. Ein Suchverfahren ist ein Algorithmus, der dazu dient einem Suchraum nach einem Objekt oder einem Muster mit bestimmten Eigenschaften sucht. Man unterscheidet zwischen einfachen und heuristischen Suchalgorithmen. Einfache Suchalgorithmen benutzen einfache Methoden zum Durchsuchen des Suchraumes ohne Kenntnis in welcher Form die Daten vorliegen. Heuristische Verfahren akquieren Wissen über den Suchraum und verwenden dieses Wissen um Abschätzungen zum Ziel vorzunehmen und damit die Suche zu beschleunigen. 4
Binäre Suche Beispiel: Binäre Suche 2 4 5 5 7 9 10 13 17 17 17 21 23 45 49 55 62 69 72 80 92 Suche 69? Naive Suche, linear in O(n): 2 4 5 5 7 9 10 13 17 17 17 21 23 45 49 55 62 69 72 80 92 Binäre Suche, in O(log n): 2 4 5 5 7 9 10 13 17 17 17 21 23 45 49 55 62 69 72 80 92 5
Suchen in Bäumen und Graphen Es gibt in der Informatik zahlreiche Graphen-Algorithmen, die nach einem bestimmten Knoten suchen nach einer Menge bestimmter Knoten suchen nach einem minimalen Spannbaum suchen nach kürzesten Wegen von einem Knoten zu einem anderen suchen alle kürzesten Wege von einem Knoten zu allen anderen suchen alle kürzesten Wege von allen Knoten zu allen anderen suchen nach einer Rundreise über alle Knoten suchen nach einer günstigen Rundreise über alle Knoten suchen den maximalen Fluss in einem Graphen bestimmen uvm. Wir wollen uns heute auf zwei einfache, universelle Suchverfahren konzentrieren, um nach einem bestimmten Knoten in einem Baum oder Graphen zu suchen: Breitensuche Tiefensuche 6
Breitensuche in Bäumen Die Breitensuche sucht von der Wurzel aus in die Breite und expandiert somit Level für Level. Wird das gesuchte Element gefunden, so hört die Breitensuche erfolgreich auf. Wurden alle Elemente durchlaufen ohne das gesuchte Element zu finden, so befindet sich das gesuchte Element nicht im Baum. 7
Breitensuche in Graphen In Graphen funktioniert die Breitensuche äquivalent: a a b i m d b d c e c d f j f g h e g k n i j k l l m n o h l o p p 8
Tiefensuche in Bäumen Die Tiefensuche sucht von der Wurzel aus in die Tiefe, d.h. immer dem nächsten Kindknoten hinterher. Sollte es keine weiteren Kindknoten mehr geben, geht der Algorithmus wieder Schritt für Schritt zum jeweiligen Vorgänger zurück und versucht es dort erneut. Wird das gesuchte Element gefunden, so hört die Tiefensuche erfolgreich auf. Wurden alle Elemente durchlaufen ohne das gesuchte Element zu finden, so befindet sich das gesuchte Element nicht im Baum. 9
Tiefensuche: Traversierung Sucht die Tiefensuche nicht nach einem bestimmten Element, so wird der Baum komplett traversiert, d.h. alle Elemente werden einmal betrachtet. Dabei gibt es verschiedene Möglichkeiten: Preorder 1. Wert vom aktuellen Knoten 2. linker Teilbaum 3. rechter Teilbaum Inorder 1. linker Teilbaum 2. Wert vom aktuellen Knoten 3. rechter Teilbaum Postorder 1. linker Teilbaum 2. rechter Teilbaum 3. Wert vom aktuellen Knoten 1 5 10 2 6 2 9 4 9 3 4 7 10 1 4 7 10 1 3 7 8 5 8 9 3 6 8 2 5 6 10
Tiefensuche in Graphen In Graphen funktioniert die Tiefensuche äquivalent, hier wird stets der Nachfolgerknoten expandiert. In welcher Reihenfolge die Nachfolger eines Knotens bestimmt werden, hängt von der Repräsentation der Nachfolger ab, z.b. in der Reihenfolge ihres Eintrags in der Adjazenzliste. a a h j k b h b g i l d c f g h c f o m e i f j o l d e p n k p m n 11
Backtracking Backtracking (Rücksetzverfahren) ist eine Trial-and-Error-Methode um Probleme zu lösen. Wenn absehbar ist, dass aktuelle Teillösung nicht zu einer endgültigen Lösung führen kann, wird der letzte Schritt bzw. die letzten Schritte zurückgenommen, und es werden stattdessen alternative Wege probiert. Bekannte Probleme, die sich mit Backtracking lösen lassen, sind z.b.: 8-Damenproblem Springerproblem Rucksackproblem Solitär Sudoku Wegsuche 12
PAUSE 13