Algorithmen und Datenstrukturen (für ET/IT)

Werbung
Programm heute
Algorithmen und Datenstrukturen (für ET/IT)
Wintersemester 2012/13
7 Fortgeschrittene Datenstrukturen
Dr. Tobias Lasser
8 Such-Algorithmen
Lineare Suche
Binäre Suche
Binäre Suchbäume
Balancierte Suchbäume
Suchen in Zeichenketten
Computer Aided Medical Procedures
Technische Universität München
3
Entartete Suchbäume
Beispiel: Balancieren von Suchbaum
insert(1)
5
1
5
2
3
5
2
1
5
8
3
7
3
7
3
7
9
2
4
6
2
6
1
8
ausgeglichen
4
7
entartet
9
4
balancieren
• Wie können Suchbäume entarten?
• Beispiel: einfügen aus sortierter Liste
2
1
• Erwünscht: Suchbäume, die immer ausgeglichen (balanciert)
bleiben
→ AVL-Bäume, Rot-Schwarz-Bäume, B-Bäume etc.
6
3
5
7
• hier müssen zum Balancieren alle Knoten bewegt werden →
Effizienz-Problem
4
5
Ansätze für balanciert Suchbäume
Definition AVL-Baum
• Binärbaum und gleichzeitig balanciert ist ineffizient
Definition AVL-Baum
• Idee: Aufweichen eines der beiden Kriterien!
Ein binärer Suchbaum G = (V , E ) mit Wurzel w ∈ V heißt
AVL-Baum, falls er die AVL-Bedingung erfüllt:
• Abschwächung des Kriteriums balanciert
• Beispiel: AVL-Bäume
• für jeden inneren Knoten v ∈ V gilt: Höhe von linkem und
• Abschwächung des Kriteriums Binärbaum
• Mehrweg-Bäume, Beispiel: B-Bäume
• benannt nach G.M. Adelson-Velskii und E.M. Landis
rechtem Teilbaum von v unterscheidet sich maximal um 1.
(russische Mathematiker)
• mehrere Verzweigungen kodiert als Binärbaum, Beispiel:
• AVL-Bedingung nur für Wurzel w ist nicht ausreichend
• beide Teilbäume der Wurzel können entartet sein
Rot-Schwarz-Bäume
7
6
AVL-Baum: Beispiel
AVL Baum: Operationen
5
6
2
7
2
7
• Operationen search, minimum, maximum unverändert von
1
4
6
3
1
4
3
binärem Suchbaum
• Operationen insert, erase müssen verändert werden, damit die
5
AVL-Bedingung erhalten wird
AVL-Baum
kein AVL-Baum!
• linkes Beispiel: AVL-Bedingung überall erfüllt
• rechtes Beispiel: AVL-Bedingung in Wurzel verletzt
8
9
AVL-Baum: Einfügen
Einfügen / Verletzung AVL-Bedingung
Einfüge-Operation bei AVL-Baum:
Fallunterscheidung Verletzung AVL-Bedingung bei Einfügen:
• insert wie in binärem Suchbaum
1
Einfügen in linken Teilbaum des linken Kindes
2
Einfügen in rechten Teilbaum des linken Kindes
• AVL-Bedingung: balance ∈ {−1, 0, +1}
3
Einfügen in linken Teilbaum des rechten Kindes
• nach insert: balance ∈ {−2, −1, 0, 1, +2}
4
Einfügen in rechten Teilbaum des rechten Kindes
• nun kann AVL-Bedingung verletzt sein:
• balance = height(left) - height(right)
1 und 4 sind symmetrische Fälle, sowie 2 und 3
• reparieren der AVL-Bedingung mittels Rotation und
Doppelrotation
10
AVL-Baum: Rotation
1
AVL-Baum: Doppelrotation
Einfügen in linken Teilbaum des linken Kindes:
+1
11
+2
insert(k3)
k1
2
Einfügen in rechten Teilbaum des linken Kindes:
0
Rotation
+1
k2
k1
+1
k2
+2
insert(k3)
k1
k2
k1
k2
+1
k1
+2
insert(k3)
3
k1
k2
insert(k3)
+2
k1
k2
k2
k1
k1
k2
+2
Rotation
0
Rotation
k1
+1
+1
k2
Einfügen in linken Teilbaum des rechten Kindes:
+1
0
Rotation
k1
k2
k3
k2
k3
Einfügen in rechten Teilbaum des rechten Kindes:
k3
+1
k3
4
0
Rotation
k1
+1
k3
+2
Rotation
k1
k2
k3
+1
k3
k1
k2
k3
k3
k2
k3
12
13
AVL-Baum: Beispiel-Sequenz I
AVL-Baum: Beispiel-Sequenz II
insert(7)
Rotation
insert(16)
4
insert(3)
insert(2)
insert(1)
3
Rotation
3
2
2
1
2
3
1
2
3
Rotation
2
3
6
4
1
6
3
5
2
7
2
3
1
2
4
3
1
5
4
2
5
7
Doppelrotation
4
5
3
5
1
3
6
2
6
6
1
5
3
16
insert(15)
4
2
4
1
7
4
1
6
Rotation
insert(6)
2
5
1
1
insert(5)
4
insert(4)
3
2
4
3
5
7
1
3
5
15
6
16
7
16
15
14
AVL-Baum: Löschen
15
Programm heute
7 Fortgeschrittene Datenstrukturen
Löschen-Operation bei AVL-Baum:
• erase wie in binärem Suchbaum
8 Such-Algorithmen
• Verletzung der AVL-Bedingung in Teilbäumen durch
Lineare Suche
Binäre Suche
Binäre Suchbäume
Balancierte Suchbäume
Suchen in Zeichenketten
Rotationen reparieren
• bei jedem Eltern-Knoten wieder AVL-Bedingungen reparieren,
bis hin zur Wurzel
16
17
Suchen in Zeichenketten
Brute-Force Suche
D A S
• Problem: find Teilwort in (langem) anderen Wort
1
• auch genannt: String-Matching
1
• Beispiele:
• Suche Text in Textverarbeitung / Web-Browser
• Suche Text in Dateien auf Festplatte (z.B. Spotlight, Windows
Search)
• Suche Text im Internet (z.B. Google)
3
1
2
4
S
I
S T E
I N S
I N N
S
I N N
S
I N N
S
I N N
S
I N N
...
4
• Maß der Effizienz: Anzahl der Vergleiche zwischen Buchstaben
der Worte
I N N L O S E R T E X T
S
I N N
16
18
Notationen
19
Brute-Force Algorithmus
Input: zu durchsuchender Text text Länge n,
gesuchtes Muster pat Länge m
Output: Index i von Match (oder -1 falls nicht gefunden)
bruteForceSearch(text, pat):
for i = 0 to n − m {
j = 0;
while ( (j < m) && (pat[j] == text[i + j]) )
j = j + 1;
if (j ≥ m) return i; // fündig geworden
}
return -1; // nichts gefunden
• Zu durchsuchender Text:
• text[0..n − 1]
• Länge n
• gesuchtes Muster = Pattern:
• pat[0..m − 1]
• Länge m
• Problem: finde Position i, so daß pat == text[i..i + m − 1]
• Komplexität: O((n − m)m) = O(nm)
20
21
Knuth-Morris-Pratt Algorithmus
KMP Algorithmus: Beispiel
A B C A B A B A B C A A B A B
Knuth-Morris-Pratt Algorithmus (kurz: KMP)
• Idee: verbessere Brute-Force Algorithmus durch Ausnutzung
A B C A A B
der bereits gelesenen Information bei einem Mismatch
j=
0 1 2 3 4
• Mismatch an Stelle j von pat impliziert
A B C A A B
j=
pat[0..j − 1] == text[i..i + j − 1]
0 1 2
A B C A A B
j=
D A S
S
I
S T E
I N S
0 1 2
I N N L O S E R T E X T
A B C A A B
I N N
j=
• Vorverarbeitungsschritt: analysiere vor Suche das Muster pat,
speichere mögliche Überspringungen in Feld next
0 1 2 3 4 5
j
0
1
2
3
4
5
next[j]
-1
0
0
0
1
1
22
KMP Algorithmus
23
KMP Algorithmus: next Tabelle I
j
Input: zu durchsuchender Text text Länge n,
gesuchtes Muster pat Länge m
Output: Index i von Match (oder -1 falls nicht gefunden)
KMPSearch(text, pat):
j = 0;
for i = 0 to n − 1 {
while ( (j ≥ 0) && (pat[j] != text[i]) )
j = next[j];
j = j + 1;
if (j == m)
return i − m + 1; // fündig geworden
}
return -1; // war wohl nix
1
next[j]
A B C A A B
0
A B C A A B
2
A B C A A B
0
A B C A A B
3
A B C A A B
0
A B C A A B
4
A B C A A B
1
A B C A A B
5
A B C A A B
1
A B C A A B
24
25
KMP Algorithmus: next Tabelle II
KMP Algorithmus: Komplexität
Input: Muster pat Länge m
initNext(pat):
next[0] = −1; next[1] = 0;
pos = 2; cnd = 0;
while (pos < m) {
if (pat[pos − 1] == pat[cnd]) {
cnd = cnd + 1;
next[pos] = cnd;
pos = pos + 1;
} else {
if (cnd > 0) cnd = next[cnd];
else {
next[pos] = 0;
pos = pos + 1;
}
}
}
Komplexität von KMP Algorithmus:
• KMPSearch: innere Schleife maximal 2n Durchläufe: O(n)
• initNext: innere Schleife maximal m Durchläufe: O(m)
• insgesamt: O(n + m)
• Platzbedarf: O(m)
27
26
Ausblick: Suchen in Zeichenketten
Zusammenfassung
• Brute-Force Algorithmus
• Komplexität: O(mn)
• Knuth-Morris-Pratt Algorithmus
• Komplexität: O(m + n)
7 Fortgeschrittene Datenstrukturen
• Rabin-Karp Algorithmus: Suchen mit Hash-Funktion
• Komplexität im Mittel: O(m + n)
• Komplexität worst-case: O(mn)
8 Such-Algorithmen
Lineare Suche
Binäre Suche
Binäre Suchbäume
Balancierte Suchbäume
Suchen in Zeichenketten
• Boyer-Moore Algorithmus: Suchen rückwärts
• Komplexität: O(n)
• Komplexität best-case: O(n/m)
• Reguläre Ausdrücke mit endlichen Automaten
• Suche nach ähnlichen Zeichenketten
28
29
Herunterladen