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