1.3 Knuth-Morris-Pratt-Algorithmus • Präprozessing bestimmt längste Ränder der Präfixe von P • Die Kenntnis der Ränder erspart Vergleiche bei periodischen Suchwörtern • Laufzeit: Θ(m) für das Präprozessing, Θ(n) für die Suche • im Mittel nicht wesentlich besser als der Naive Algorithmus R. Stiebe: Textalgorithmen, WS 2003/04 27 Idee des KMP-Algorithmus Lemma. Tritt ein Wort u im Text T an der Stelle k auf, so kann das nächste Vorkommen von u frühstens an der Stelle k 0 = k + Per (u) auftreten. Das Vorkommen des Präfixes der Länge Border (u) an der Stelle k 0 ist dabei bereits garantiert. Definition. Für 1 ≤ i ≤ |P | seien Border i(P ) bzw. Per i(P ) die Länge des längsten Randes bzw. der kürzesten Periode von P [1 . . . i]. Wir setzen Border 0(P ) := 0 und Per 0(P ) := 1. Morris-Pratt-Verschiebungsregel Stimmen die ersten i Zeichen von P und T überein, so darf man P um Per i(P ) Felder verschieben und die ersten Border i(P ) Vergleiche auslassen. R. Stiebe: Textalgorithmen, WS 2003/04 28 Morris-Pratt-Verschiebung – Beispiel Für P = abcabba erhalten wir folgende Werte für Border i und Per i. i 0 1 2 3 4 5 6 7 Border i 0 0 0 0 1 2 0 1 Per i 1 1 2 3 3 3 6 6 Wurde für P eine Übereinstimmung der Länge 5 an der Textstelle k gefunden, so darf man P um Per 5(P ) = 3 Stellen verschieben und die ersten Border 5 = 2 Vergleiche auslassen. - a b c a b b a P a b c a b b a P * * * * * * * a b c a b * * * * * * * * * * * * * * * * T j k R. Stiebe: Textalgorithmen, WS 2003/04 29 Algorithmus 1.3 Morris-Pratt-Algorithmus Eingabe: Wörter P , T mit |P | = m, |T | = n (Die Werte Border i und Per i für P sind bekannt) Ausgabe: Menge S der Vorkommen von P in T (1) S ← ∅; k ← 1; i ← 1; j ← k; (2) while k ≤ n − m + 1 (3) while i ≤ m and P [i] = T [j] (4) i ← i + 1; j ← j + 1; (5) if i = m + 1 then S ← S ∪ {k}; (6) k ← k + Per i−1; (7) j ← k + Border i−1(P ); (8) i ← j − k + 1; Satz. Der Morris-Pratt-Algorithmus findet alle Vorkommen von P in T mit einer Laufzeit von O(n). R. Stiebe: Textalgorithmen, WS 2003/04 30 MP-Präprozessing Ziel: Bestimmung der Werte Border i in Zeit O(m) Beobachtung: Es sei P [i + 1] = x, α der längste Rand von P [1 . . . i] und β der längste Rand von P [1 . . . i + 1]. Ist P [|α| + 1] = x, so ist β = αx; anderenfalls ist β der längste Rand von αx. R. Stiebe: Textalgorithmen, WS 2003/04 31 Algorithmus 1.4 MP-Präprozessing Eingabe: Wort P mit |P | = m Ausgabe: Border i(P ) für 0 ≤ i ≤ m (1) Border 0 ← 0; Border 1 ← 0; (2) for i ← 2 to m (3) t ← Border i−1; (4) while P [i] 6= P [t + 1] and t > 0 (5) t ← Border t; (6) if P [i] 6= P [t + 1] then Border i ← 0; (7) else Border i ← t + 1; Lemma. Algorithmus 1.4 ermittelt die Werte Border i(P ) in einer Zeit von O(m). R. Stiebe: Textalgorithmen, WS 2003/04 32 Graphische Interpretation Für P mit |P | = m konstruiere Graphen mit den Knoten 0, 1, . . . , m, den beschrifteten Vorwärtskanten (i − 1, P [i], i), 1 ≤ i ≤ m und den unbeschrifteten Rückwärtskanten (i, Border i) (failure links). Die Suche beginnt im Knoten 0. Der aktuelle Knoten sei i, die aktuelle Textstelle sei j. 1. Gibt es die Vorwärtskante (i, T [j], i + 1), so gehe zum Knoten i + 1 und zur Textstelle j + 1. 2. Ist i = 0 und gibt es die Vorwärtskante (0, T [j], 1) nicht, so bleibe im Knoten i und gehe zur Textstelle j + 1. 3. Anderenfalls gehe zum Knoten Border i und bleibe bei der Textstelle j. Erreicht man den Knoten m an der Stelle j, so endet dort ein Vorkommen von P . R. Stiebe: Textalgorithmen, WS 2003/04 33 Graphische Interpretation – Beispiel Für P = abcabba ergibt sich der folgende Graph: ? 0 a 6 1 b R. Stiebe: Textalgorithmen, WS 2003/04 6 2 c 3 a 4 b 5 b 6 a 7 34 Verbesserung von Knuth Beobachtung: Gilt P [i + 1] = P [Border i(P ) + 1] und T [j] 6= P [i + 1], so gilt nach der Verschiebung um Per i(P ): T [j] 6= P [Border i(P ) + 1]. Knuth-Morris-Pratt-Verschiebungsregel SPer i(P ) sei die kürzeste Periode von P [1 . . . i], die keine Periode von P [1 . . . i + 1] ist. Stimmen genau die ersten i Zeichen überein, so verschiebe um SPer i(P ). Beispiel. Für P = am gilt Per i(P ) = 1 und SPer i(P ) = i für i < m. Tritt das erste Mismatch an der (i+1)-ten Stelle auf, so beträgt die MP-Verschiebung 1, die KMP-Verschiebung i. R. Stiebe: Textalgorithmen, WS 2003/04 35 Vergleich MP-Algorithmus – KMP-Algorithmus • KMP-Algorithmus ist für jede Eingabe mindestens so gut wie MP-Algorithmus • Zahl der Vergleiche: zwischen n − m + 1 und 2n für beide Algorithmen. • Verzögerung (delay ) an Stelle j: Anzahl der Vergleiche mit T [j] minus 1. maximale Verzögerung für MP-Algorithmus: m − 1. maximale Verzögerung für KMP-Algorithmus: Θ(log m). R. Stiebe: Textalgorithmen, WS 2003/04 36 1.4 Suche mit deterministischen endlichen Automaten • eng verwandt mit Knuth-Morris-Pratt-Algorithmus • Idee: Konstruiere den minimalen DEA, der die Sprache Σ∗P akzeptiert. • Vorteil: Suche erfolgt ohne Verzögerung (jede Textstelle genau einmal) • Nachteil: DEA braucht Speicherplatz von Θ(σ · m). R. Stiebe: Textalgorithmen, WS 2003/04 37 Konstruktion des minimalen DEA Für P = x1x2 · · · xm ergibt sich der DEA AP = (Σ, {0, 1, . . . , m}, δ, 0, {m}) mit δ(i, x) = Länge des längsten Suffixes von P [1 . . . i]x, das Suffix von P ist, das heißt δ(i, x) = i+1 , falls 0 ≤ i < m, x = xi+1 . δ(Border i, x), sonst Beispiel. Für P = abcabba ergibt sich der folgende DEA (Kanten zum Zustand 0 wurden weggelassen): a a 0 a ? 6 1 b a R. Stiebe: Textalgorithmen, WS 2003/04 6 2 c 6 3 a 4 a a b 5 c b 6 a 7 b 38 Algorithmus 1.5 DEA-Algorithmus zur Wortsuche Eingabe: Wörter P , T über Σ mit |P | = m, |T | = n Ausgabe: Menge S der Vorkommen von P in T (1) Konstruiere den DEA AP = (Σ, {0, 1, . . . , m}, δ, 0, {m}); (2) S ← ∅; z ← 0; (3) for j ← 1 to n (4) z ← δ(z, T [j]); (5) if z = m then S ← S ∪ {j − m + 1}; Satz. Algorithmus 1.5 findet alle Vorkommen von P in T mit einer Laufzeit von Θ(σ · m) für die Konstruktion von AP und Θ(n) für die Suche. R. Stiebe: Textalgorithmen, WS 2003/04 39 Variante von Simon • speichert den DEA mit Aufwand O(m) – unabhängig von Σ • Laufzeit ist linear in n • Verzögerung ist beschränkt durch log2 σ. R. Stiebe: Textalgorithmen, WS 2003/04 40 Vereinfachung des DEA Kanten in AP : Vorwärtskante: (k, x, k + 1) nichttriviale Rückwärtskante: (k, x, j + 1) mit 0 ≤ j < k triviale Rückwärtskante: (k, x, 0) Lemma. Es sei P ∈ Σ∗ ein Wort der Länge m. Der Graph des Automaten AP enthält höchstens m nichttriviale Rückwärtskanten. R. Stiebe: Textalgorithmen, WS 2003/04 41 Idee des Simon-Algorithmus • Ermittle und speichere von AP nur nichttriviale Rückwärtskanten. • Suche erfolgt analog zum DEA-Algorithmus. • Vorteil gegenüber DEA-Algorithmus: Speicherplatz O(m). • Nachteil gegenüber DEA-Algorithmus: Verzögerungen aber: maximale Verzögerung nur von σ abhängig (besser als KMP) R. Stiebe: Textalgorithmen, WS 2003/04 42 Implementierungen des Simon-Algorithmus • nichttriviale Rückwärtskanten für jeden Knoten als Liste gespeichert: mögliche Verzögerung: σ − 1 Sind Zielknoten in fallender Ordnung gespeichert, ist die Verzögerung niemals größer als bei KMP. • nichttriviale Rückwärtskanten für jeden Knoten als geordnetes Array gespeichert: mögliche Verzögerung: log2 σ (binäre Suche) R. Stiebe: Textalgorithmen, WS 2003/04 43 Laufzeit des Simon-Algorithmus Lemma. Es sei P ∈ Σ∗ ein Wort der Länge m. Gehen von einem Knoten k im Graphen von AP r nichttriviale Rückwärtskanten aus, so gilt für jede Rückwärtskante (k, x, j + 1): k − j ≥ r. Satz. Es seien P, T ∈ Σ∗ mit |P | = m, |T | = n. Jede Implementierung des SimonAlgorithmus, die eine Vorwärtskante in einem Schritt und eine Rückwärtskante von einem Knoten mit r nichttrivialen Rückwärtskanten in höchstens r + 1 Schritten findet, findet die Vorkommen von P in T in höchstens 2n Schritten. (Das heißt, für jede “vernünftige” Implementierung hat der Algorithmus lineare Laufzeit (unabhängig von σ).) R. Stiebe: Textalgorithmen, WS 2003/04 44