Pro Informatik 2009 - OOP - Tag 18 - Institut für Informatik

Werbung
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
Herunterladen