Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Algorithmen und Datenstrukturen 1 Kapitel 6 Robert Giegerich und Jens Stoye Technische Fakultät Universität Bielefeld [email protected] Vorlesung, U. Bielefeld, Winter 2008/2009 Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Kapitel 6: Algorithmen auf Zeichenreihen Anwendungsgebiete Verarbeitung von Zeichenreihen ist wichtiges Teilgebiet der Informatik, z.B. Erstellen, Durchsuchen, Archivieren von Dokumenten Text-Kompression & Datenkompression (auf allen digitalen Übertragungswegen) Genomforschung: Genome, Gene; Proteindatenbanken Internet-Suchmaschinen Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Fragestellungen Suchen (Muster P in Text T ) Vergleichen (Text S gegen Text T ) Clustering und Klassifizierung von Mengen von Zeichenreihen Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Logische Varianten Exakte Suche oder Vergleich (Ja/Nein; alle Auftreten/ein Auftreten) Approximative Suche oder Vergleich (kleine Abweichungen erlaubt – bester Treffer gesucht) Paarweiser vs. multipler Vergleich Einfache vs. multiple Mustersuche Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Technische Varianten z.B. bei Mustersuche 1 beide P und T variabel: “naive” Verfahren 2 P bekannt, T variabel: generiere spezielles Suchverfahren (“Matcher”) für M in wechselnden Texten T 3 P variabel, T (relativ) stabil: generiere Index-Struktur zum schnellen Durchsuchen für wechselnde P Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus z.B. beim Vergleichen 4 beide Texte etwa gleich groß – Vergleich über volle Länge 5 beste lokale Ähnlichkeit. (Was ist die ähnlichste Tonfolge in zwei Musikstücken?) 6 kleiner Abschnitt in langem Text. (Z.B. wird “Giegerich” in der Bibel nicht erwähnt. Was ist die dazu ähnlichste Zeichenreihe, die darin vorkommt?) Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus z.B. bei großen/komprimierten Texten 7 online-Verfahren: Text wird nur einmal gelesen, von links nach rechts 8 residente Verfahren: ganzer Text muss gleichzeitig verfügbar sein für Zugriffe in beliebiger Folge Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Mehr Beispiele zu 1 – 8 1 Text-Editor: Finde alle Auftreten eines Wortes; ersetze durch ein anderes 2 Übersetzung von Programmiersprachen: Erkennung der lexikalischen Grundsymbole der Sprache in Programmen (Lexikalische Analyse als 1. Stufe der Syntaxanalyse) 3 Suche nach Stichworten im Werk von Shakespeare; Suche nach DNS-Muster (“ACGTAACCTTA”) im menschlichen Genom (3.3 GB) Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus 4 Textvergleich abgeschriebener (?) Hausaufgaben; Vergleich zweier orthologer Gene (ortholog: verwandt durch Abstammung) 5 Aussortieren von Zerfallsprodukten der RNS; (sie sind Teile längerer Sequenzen; siehe auch 3) 6 Suche nach “Raubkopien” von Musikstücken 7 Komprimieren/Dekomprimieren auf Übertragungswegen; Verschalten von Programmen als Unix “pipes”; “Listlessness” bei funktionalen Programmen 8 Komplexere Suchmusteranfragen, z. B. verteilte Repeats im menschlichen Genom Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Effizienz-Betrachtungen Hier eine allgemeine Vorausbetrachtung zur Effizienz – noch haben wir keine Algorithmen gesehen. Sei |P| = m, |T | = n. Untergrenze der worst-case Effizienz: O(m + n) bzw. denn alle Zeichen im Muster/Text müssen mindestens einmal gelesen werden. O(m · n) ist trivial erreichbar bei Vorverarbeitung von Muster oder Text muss Generierungsaufwand gegen verbesserten Suchaufwand abgewogen werden (amortisierte Effizienz) Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Untergrenze für das Finden von P nach Vorverarbeitung von T ist O(m) – das wäre unabhängig von der Größe des Textes! Eine Besonderheit wird wichtig bei sehr großen Texten: Größe des Index kann kritisch werden. Das Lokalitätsverhalten der Indexkonstruktion und der Suche spielt eine Rolle in Rechnern mit Cache-Architektur (Thrashing) Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Konstante Faktoren Der Vergleich zweier Zeichen ist charakteristische Operation Ansonsten wird kaum etwas gerechnet Konstante Faktoren sind generell gering, asymptotische Laufzeit ist hartes Kriterium Ausnahme: Thrashing-Phänomene Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus 6.2 Grundlegende Definitionen Die Suche nach allen (exakten) Vorkommen eines Musters in einem Text ist ein Problem, das häufig auftritt (z.B. in Editoren, Datenbanken etc.). Wir vereinbaren folgende Konventionen: Alphabet Σ Muster P Text T P[j] P[b..e] = = = = endlicher Zeichenvorrat P[0..m − 1] ∈ Σm T [0..n − 1] ∈ Σn Zeichen an der Position j Teilwort von P “von bis” den Positionen b und e Beispiel P = abcde, P[0] = a, P[3] = d, P[2..4] = cde. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Notation: leeres Wort: Länge eines Wortes x: |x| Konkatenation zweier Wörter x und y : xy Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Präfix und Suffix Sei x = uvw , mit u, v , w ∈ P∗ . Dann heißt u Präfix von x, v Teilwort von x und w Suffix von x. Beachte: “abc” hat Präfixe , “a”, “ab”, “abc” und die Suffixe “abc”, “bc”, “c”, . Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Das Problem der exakten Suche Definition Ein Muster P kommt mit der Verschiebung s im Text T vor, falls 0 ≤ s ≤ n − m und T [s..s + m − 1] = P[0..m − 1] gilt. In diesem Fall nennen wir s eine gültige Verschiebung. Das Problem der exakten Textsuche ist, alle gültigen Verschiebungen zu finden. Man kann auch sagen: Finde alle Suffixe von T , die P als Präfix haben. Beispiel T = bielefeld oh bielefeld P = feld Gültige Verschiebungen: s = 5 und s = 18. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Die naive Lösung des Problems sieht so aus: naive1 p t = [i|i <- [0..length t - 1], p == take (length p) (drop i t)] Diese Lösung ist offensichtlich NICHT effizient – sie führt zum Aufwand O(n2 + 2nm) wegen der Aufrufe von drop. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Besser ist die Variante naive2 p t = [i|(i,w) <- zip [0..] where m = length p (suffixes t), p == take m w] suffixes [] = [[]] suffixes (x:xs) = (x:xs) : suffixes xs Hier ist der worst-case Aufwand O(m · n) Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Am Beispiel T = abrakadabraxasa und P = abraxas erkennt man das ineffiziente Vorgehen, insbesondere wenn Text und Muster immer komplett verglichen werden: a b r a k a d a b r a x a s a | | | | o | o a b r a x a s o o o o o o o - a b r a x a s o o o | o | o - a b r a x a s | o o o o o o - a b r a x a s o o o | o o o - a b r a x a s | o o o o | o - a b r a x a s o o o o o o o - a b r a x a s | | | | | | | - a b r a x a s o o o o o o o - a b r a x a s Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Selbst wenn Text und Muster zeichenweise von links nach rechts und nur bis zum ersten Mismatch1 verglichen werden, ist die worst-case Zeiteffizienz des naiven Algorithmus O n · m , z.B. wird für T = an , P = am der Vergleich p = . . . n − m + 1 mal ausgeführt und in jedem Test in werden m Zeichen verglichen. Wie kann man den naiven Algorithmus verbessern? Idee 1: Überspringe ein Teilwort w von T , falls klar ist, dass w 6= P (BM-Algorithmus 1977). Idee 2: Merke Informationen über bisherige Vergleiche und nutze diese, um neue, unnötige Vergleiche zu vermeiden (KMP-Algorithmus 1977). 1 Die zwei Zeichen stimmen nicht überein. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus 6.3 Der Boyer-Moore-Algorithmus Der BM-Algorithmus legt wie der naive Algorithmus das Muster zunächst linksbündig an den Text, vergleicht die Zeichen des Musters dann aber von rechts nach links mit den entsprechenden Zeichen des Textes. Beim ersten Mismatch benutzt er zwei Heuristiken, um eine Verschiebung des Musters nach rechts zu bestimmen. Beispiel: T = RHABARBERBARBARA P = BARBIER Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Die bad-character Heuristik Falls beim Vergleich von P[0..m − 1] und T [s..s + m − 1] (von rechts nach links) ein Mismatch P[j] 6= T [s + j] für ein j mit 0 ≤ j ≤ m − 1 festgestellt wird, so schlägt die bad-character Heuristik BCH(T [s + j]) eine Verschiebung des Musters um j − k Positionen vor, wobei k der größte Index (0 ≤ k ≤ m − 1) ist mit T [s + j] = P[k]. Wenn kein k mit T [s + j] = P[k] existiert, so sei k = −1. BCH wird vor Beginn der Suche berechnet!! Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus h i n o BCH T [s + j] = max k|P[k] = T [s + j] 0≤km−1 Berechne: ∀a ∈ X Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 BCH[a] = max 0≤km−1 n o k|P[k] = a Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Einfacher gesagt: T [s + j] ist der “bad character”. Wir verschieben das Muster so, dass das rechteste Auftreten des bad character im Muster, also P[k], unter T [s + j] liegt. Problem: Wenn k > j, würde das Muster nach links verschoben! Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Die good-suffix Heuristik Falls beim Vergleich von P[0..m − 1] und T [s..s + m − 1] (von rechts nach links) ein Mismatch P[j] 6= T [s + j] für ein j mit 0 ≤ j ≤ m − 1 festgestellt wird, so wird das Muster so weit nach rechts geschoben, bis das bekannte Suffix T [s + j + 1..s + m − 1] wieder auf ein Teilwort des Musters passt. Im Boyer-Moore-Algorithmus wird das Muster um das Maximum von beiden vorgeschlagenen Verschiebungen verschoben. Es kann gezeigt werden, dass die Laufzeitkomplexität dann im worst case O(n + m) ist. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen Vorverarbeitungsschritte: Bad character Heuristik: Good suffix Heuristik: Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Die Verschiebespannen beider Heuristiken werden vorab durch Analyse von P ermittelt und tabelliert P BCH: → [−1..m − 1] BCH(a) = k gdw. k ist rechtestes Auftreten von a in P; oder k = −1 GSH: [0..m − 1] → [−1..m − 1] GSH(j) = max r : P[r ..r + (m − 1)− (j + 1)] = P[j + 1..m − 1] oder r = −1 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Beispiel Die bad-character Heuristik schlägt eine Verschiebung von j − k = (m − 3) − 5 = (12 − 3) − 5 = 4 Positionen vor; dies ist im Fall (b) illustriert. Aus der Darstellung (c) wird ersichtlich, dass die good-suffix Heuristik eine Verschiebung von 3 Positionen vorschlägt. Also wird das Muster um max{4, 3} = 4 Positionen nach rechts verschoben. bad character ... w r i t t e n s good suffix ? ?z }| { n o t i c e o t h a t ... - r e m i n i s c e n c e (a) ... w r i t t e n s+4 n o t i c e t h a t ... - r e m i n i s c e n c e (b) ... w r i t t e n s+3 n o t i c e t h a t ... - r e m i n i s c e n c e (c) Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Ein Beispiel, in dem die Bad-Character-Heuristik eine Verschiebung nach links (negativ) vorschlägt: ... R H A B A R B E R B A R B A R A B R A ... B I E R B A R 6 rechtes Auftreten von t in P 6 bad character t ergibt Verschiebung −3! Good suffix Heuristik: Verschiebung +7. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Wirksamkeit der Heuristiken: lange gute Suffixe sind selten, in der Regel beruhen große Verschiebungen auf der bad-character Heuristik Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Der Boyer-Moore-Horspool-Algorithmus Der BM-Algorithmus verdankt seine Schnelligkeit vor allem der bad-character Heuristik. Daher wurde 1980 von Horspool eine Vereinfachung des BM-Algorithmus vorgeschlagen: Die bad-character Heuristik wird derart modifiziert, dass sie immer eine positive Verschiebung vorschlägt. Damit wird die good-suffix Heuristik überflüssig (und auch die Vorverarbeitung einfacher). Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Der Boyer-Moore-Horspool-Algorithmus Der BMH-Algorithmus geht in den meisten Fällen analog zur bisherigen bad-character Heuristik vor. Aber: Falls P[j] 6= T [s + j] für ein j (0 ≤ j ≤ m − 1) gilt, so wird s um m − 1 − k erhöht, wobei k der größte Index zwischen 0 und m − 2 ist mit T [s + m − 1] = P[k]. Wenn kein k (0 ≤ k ≤ m − 2) mit T [s + m − 1] = P[k] existiert, so wird s um m erhöht. Das Muster wird also um “ ˆ ˜ ˘ ¯” λ T [s+m−1] = min {m}∪ m−1−k | 0 ≤ k ≤ m−2 und T [s+m−1] = P[k] verschoben. Wenn ein Match gefunden wurde, dann wird ebenfalls um λ T [s + m − 1] verschoben. Vorverarbeitung: λ[c] für alle c ∈ Σ. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Verhalten des BMH-Algorithmus bei einem Mismatch ... g o l d e n s- f l e e c e o o f ... r e m i n i s c e n c e ⇓ ... g o l d e n s+3 Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 f l e e c e o f ... - r e m i n i s c e n c e Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Verhalten des BMH-Algorithmus bei einem Treffer ... g o l d e n s f l e e c e o f ... - f l e e c e ⇓ ... g o l d e n s+2 Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 f l e e c e o f ... - f l e e c e Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Boyer-Moore-Horspool Algorithmus in Haskell import Array Eine halbherzige Lösung lambda :: String -> String -> Int -> Int lambda p t s = minimum (m:[m-1-k | k <- [0..(m-2)], t!!(s+m-1) == p!!k]) where m = length p bMh :: String -> String -> [Int] bMh p t = bmh’ 0 p t where bmh’ i p t | i > (length t)-(length p) = [] | p == (take (length p) (drop i t)) = i:(bmh’ (i + lambda p t i) p t) | otherwise = bmh’ (i + lambda p t i) p t Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Kritik: 1 Die Repräsentation von Muster und Text als String statt als Array verhindert das Erreichen guter Effizienz. 2 Die Verschiebefunktion λ wird nicht vorab berechnet, sondern bei jedem Gebrauch neu. 3 Für die lokale Funktion bmh’ sind p und t bekannt. Es ist unnötig, sie jedesmal als (unveränderte) Parameter zu übergeben. 4 λ sollte lokale Funktion von bmh sein, da auch dafür p und t konstant sind. 5 Eine zentrale BMH-Idee ist, dass λ(a) für alle a aus [’A’..’z’] berechnet wird. Dadurch wird λ unabhängig von Text t!! Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Eine korrekte Lösung type SArr = Array Int Char bmh:: SArr -> SArr -> [Int] bmh p t = bmhi 0 m where ( ,m) = bounds p ( ,n) = bounds t bmhi i k |i+m >n = [] |k == 0 = [i|t!i == p!0]++ bmhi (i+shift!(t!(i+m))) m |t!(i+k) == p!k = bmhi i (k-1) |otherwise = bmhi (i+shift!(t!(i+m))) m shift shift [0..m-1]] :: Array Char Int = accumArray min (m+1) (’A’,’z’) [(p!k,m-k)|k <- Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Zum Aufruf mit zwei Strings tbmh p t = bmh (mk p) (mk t) where mk s = listArray (0,length s -1) s Zum separat Angucken eine ent-lokalisierte Kopie von shift shift shift p :: SArr -> Array Char Int = accumArray min (m+1) (’A’,’z’) [(p!k,m-k)|k <- [0..m-1]] where ( ,m) = bounds p Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus 6.4 Der Knuth-Morris-Pratt-Algorithmus Der naive Algorithmus: a b r a | | | | a b r a o -a b r o -a b | -a k a d a b e r a b r a k a d a b r a k a b r a k a d a b r a | | | | | o k a d a b r a a k a d a b r a r a k a d a b r a o b r a k a d a b r a etc. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Man erkennt, dass im zweiten und dritten Schritt das Zeichen a an Position 1 im Muster mit den Zeichen b und r an der zweiten und dritten Position des Textes verglichen wird, obwohl bereits nach dem positiven Vergleich von abra klar sein musste, dass hier keine Übereinstimmung existieren kann. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Der Knuth-Morris-Pratt-Algorithmus geht nach folgendem Schema vor: Wenn ein Teilwort (Präfix) des Musters bereits erkannt wurde, aber dann ein Mismatch auftritt, so ermittelt der Algorithmus das längste Präfix dieses Teilwortes, das gleichzeitig echtes Suffix davon ist, und schiebt das Muster dann so weit nach rechts, dass dieses Präfix an der bisherigen Position des Suffixes liegt. a b r a k a d a b e | | | | | | | | | o a b r a k a d a b r o -a b r o -a r a b r a k a d a b r a k a b r a k a d a b r a a a k a d a b r a b r a o -a b r | | -a b k a d a b r a a k a d a b r a | | | | | | | | | r a k a d a b r a | | o -a b r a k a d a b r a | | | | | | | | | | -a b r a k a d a b r a Man erkennt, dass hier drei unnötige Vergleiche vermieden wurden. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Beispiel: Die Präfixfunktion π : {1, 2, . . . , m} → {0, 1, . . . , m − 1} für ein Muster P[0..m − 1] ist definiert durch π[q] = max{k : k < q − 1 und P[0..k] ist echtes Suffix von P[0..q − 1]}. Sie lautet für unser Beispielwort P = abrakadabra: q P[q] π[q] 0 a ⊥ 1 b 0 2 r 0 3 a 0 4 k 1 5 a 0 6 d 1 7 a 0 8 b 1 9 r 2 10 a 3 11 ⊥ 4 Für q = 9 wäre das entsprechende Teilmuster also abrakadab. Das längste Präfix, das gleichzeitig echtes Suffix davon ist, ist ab. Es hat die Länge 2, darum findet sich in der Tabelle an der Position q = 9 der Eintrag π[q] = 2. P wird so verschoben, dass P[π(q)] unter der Mismatch-Position in T steht, d. h. S 7−→ S + q − π[q]. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Berechnung der Präfixfunktion für KMP Vorgehen: induktiv Annahme: Die Werte von π sind bereits für 1 . . . q − 1 berechnet. Gesucht: π[q] = max{k | k < q und P[0..k − 1] ist echtes Suffix von P[0..q − 1]}. Welche k kommen in Frage? → alle echten Suffixe von P[0..q − 2], die sich zu einem echten Suffix von P[0..q − 1] erweitern lassen. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus (a) 0 k1−2 k−1 1 q−2 q−1 x k1 x k1 Sei k1 = π[q − 1] + 1 Dann ist π[q] = k1 falls, P[k1 − 1] = P[q − 1]. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus (b) andernfalls (y 6= x): k1−1 k 2−1 y x k2 q−2 q−1 k2 x k2 Sei k2 = π[k1 − 1] + 1. Dann ist π[q] = k2 , falls P[k2 − 1] = P[q − 1]. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Allgemein: ki =π[ki−1 −1]+1=π[π[ki−2 −1]+1−1]+1=···=π[π[ki−2 −1]]+1 ki =π i [q−1]+1 Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus KMP-Algorithmus in Haskell import Array Eine halbherzige Lösung für KMP (einschließlich einer besonders peinlichen Implementierung von suffixes) Pi-Funktion für den KMP: pi’ :: String -> Array Int Int pi’ p = array (1,qmax) [ (q, maximum [ k | k <- [0..q], (take k p) ‘elem‘ (suffixes (take q p)) ]) | q <- [1..qmax] ] where qmax = (length p) Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Gibt alle echten Suffixe eines Worts inklusive des leeren Worts aus: suffixes :: [a] -> [[a]] suffixes as = [ (drop n as) | n <- [1..(length as)] ] Gibt die Stelle des ersten unterschiedlichen Zeichens in zwei gleich langen Strings aus: getQ :: String -> String -> Int getQ a b = getQ’ 0 a b where getQ’ i (a:as) (b:bs) = if a/=b then i else getQ’ (i+1) as bs getQ’ i [] [] = i Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Führt den KMP aus: kMp :: String -> String -> [Int] kMp [] = error "ungueltiger Suchstring" kMp p t = kmp’ 0 p t where kmp’ i p t | i > lt-m = [] | q == m && k’ == 0 = i:kmp’ (i + m) p t | q == m && k’ > 0 = i:kmp’ (i + m - k’) p t | q < m && p!!q /= t!!(i+q) && q /= 0 = kmp’ (i + q - pq) p t | q < m && p!!q /= t!!(i+q) && q == 0 = kmp’ (i+1) p t where q = getQ p (take m (drop i t)) k’ = pit!m pq = pit!q pit = pi’ p lt = length t m = length p Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Kritik: 1 Darstellung von Text und Muster als String (statt Array) torpediert die Effizienz. 2 Suffixes haben wir in den Übungen schon eleganter implementiert – diese Implementierung ist in O(n2 )! 3 getQ vergleicht im Muster jedesmal von ganz vorne, das stimmt nicht mit der KMP-Idee überein. 4 kmp’ als lokale Funktion von KMP braucht keine Parameter p und t. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Eine korrekte Implementierung von KMP type SArr = Array Int Char kmp p t = kmp’ 0 0 where ( ,m) = bounds p ( ,n) = bounds t kmp’ i q | i+m > n = [] | q == m+1 = i:kmp’(i+q-pi!q) (pi!q) -- i+q bleibt invariant! | t!(i+q) == p!q = kmp’ i (q+1) -- q rueckt vor | q == 0 = kmp’ (i+1) 0 -- i rueckt vor |otherwise = kmp’ (i+q-pi!q) (pi!q) -- i+q bleibt invariant! pi :: Array Int Int pi = array (0,m+1) ((0,0):(1,0):[(q,iteratep (pi!(q-1)) q)| q <- [2..m+1]]) where iteratep 0 q = if p!0 == p!(q-1) then 1 else 0 iteratep k q = if p!k == p!(q-1) then k+1 else iteratep (pi!k) q Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Zum Aufruf von kmp mit zwei Strings tkmp p t = kmp (mk p) (mk t) where mk s = listArray (0,length s -1) s Ent-lokalisierte Version von pi zum Reingucken pTab p = pi where ( ,m) = bounds p pi = array (0,m+1) ((0,0):(1,0):[(q,iteratep (pi!(q-1)) q)| q <- [2..m+1]]) iteratep 0 q = if p!0 == p!(q-1) then 1 else 0 iteratep k q = if p!k == p!(q-1) then k+1 else iteratep (pi!k) q mk s = listArray (0,length s -1) s Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Ein Wettrennen zwischen KMP und BMH 1. Satz: 0:1 tkmp "accgagt" "aatcgtagagctagcatgatgtatatagcgccggcgtatagctaagcaccgataccgagtcxgaagcta" [53] (11975 reductions, 15574 cells) tbmh "accgagt" "aatcgtagagctagcatgatgtatatagcgccggcgtatagctaagcaccgataccgagtcxgaagcta" [53] (7473 reductions, 9958 cells) 2. Satz: 1:0 tkmp "abbaba" "abbababbbabaaababababbabbabbabbabababbbbabbaaaaababaabbab" [0,28] (10881 reductions, 14126 cells) tbmh "abbaba" "abbababbbabaaababababbabbabbabbabababbbbabbaaaaababaabbab" [0,28] (12374 reductions, 15919 cells) 3. Satz: 0:1 kmp "WerdurchTesten" "Programmeverstehenwilldermussschonsehrvielmessenundganzgenauhinsehen" [] (8068 reductions, 10646 cells) tbmh "WerdurchTesten" "Programmeverstehenwilldermussschonsehrvielmessenundganzgenauhinsehen" [] (5979 reductions, 8064 cells) Ergebnis:..................... Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 KMP : BMH 1:2 .................................... Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus KMP-Algorithmus als Automat mit spontanen Übergängen (ohne Kantenmarkierung; ohne Weitergehen im Text) Jeder Zustand entspricht einem erkannten Präfix; die Nummer ist q aus der π-Tabelle b =a a ab 2 r abr 3 a abra 4 k abrak 5 a abraka 6 a 1 d ε abrakad 7 0 abrakadabra 11 a abrakadabr 10 r abrakadab 9 b abrakada 8 a Speicherplatz für den KMP-Automat: O(|P|) für die Tabelle der Spontanübergänge. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus Transformation des KMP-Automaten in einen endlichen Automaten (Zusammenziehen der spontanten Übergänge, so dass bei jedem Übergang ein Zeichen gelesen wird) = a,r b a ε abr 3 r ab 2 a =a = a,b,k =a abra 4 b k = a,b,d abrak 5 a a a a 1 =a a b a d = a,b abrakad 7 0 a = a,b,k abraka 6 b k abrakadabra 11 a a abrakadabr 10 =a r a abrakadab 9 b abrakada 8 = a,r Speicherplatz für endlichen Automat: O(| Kombinationen von Zeichen und Zustand. Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 =a a = a,b P | · |P|) für alle Universität Bielefeld Algorithmen auf Zeichenreihen Grundlegende Definitionen BM-Algorithmus BMH-Algorithmus Der KMP-Algorithmus 6.5 Aho-Corasick Bei mehr als einem Muster bilden alle Präfixe aller Muster die Zustandsmenge des Aho-Corasick-Automaten. Beispiel: P1 = abra, P2 = abba, P3 = brabra. r a a = a,b ε a abr abra ab b b abb a abba b b r Robert Giegerich und Jens Stoye A&D 1 Vorlesung Winter 2008/2009 br a bra b brab r brabr a brabra Universität Bielefeld
© Copyright 2024 ExpyDoc