Pro Informatik 2009: Objektorientierte Programmierung 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? Pro Informatik 2009: Objektorientierte Programmierung 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. Pro Informatik 2009: Objektorientierte Programmierung 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 Pro Informatik 2009: Objektorientierte Programmierung 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 Pro Informatik 2009: Objektorientierte Programmierung 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. Pro Informatik 2009: Objektorientierte Programmierung 7 Breitensuche in Graphen In Graphen funktioniert die Breitensuche äquivalent: a b a c e h b d g l i f k o Pro Informatik 2009: Objektorientierte Programmierung m d n p d f j c i j k m n o e g h l l 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. Pro Informatik 2009: Objektorientierte Programmierung 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 Inorder Postorder 1. Wert vom aktuellen Knoten 2. linker Teilbaum 3. rechter Teilbaum 1. linker Teilbaum 2. Wert vom aktuellen Knoten 3. rechter Teilbaum 1. linker Teilbaum 2. rechter Teilbaum 3. Wert vom aktuellen Knoten 5 10 1 2 6 3 4 5 7 8 2 10 9 Pro Informatik 2009: Objektorientierte Programmierung 4 9 1 4 3 7 6 10 8 1 9 3 2 7 5 8 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 g c b g i l c f o m d e i f d e p n h f j k o p l m n Pro Informatik 2009: Objektorientierte Programmierung 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 Pro Informatik 2009: Objektorientierte Programmierung 12 PAUSE Pro Informatik 2009: Objektorientierte Programmierung 13