1.3 Knuth-Morris-Pratt

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