1.5 Boyer-Moore-Algorithmus Suche nach Vorkommen von P in T von links nach rechts. In einer Phase erfolgen Vergleiche von rechts nach links. Verschiebungsheuristiken: Bad Character und Good Suffix. Laufzeit: O(mn) im schlechtesten Fall, O(n/σ) im durchschnittlichen Fall. Es gibt Varianten mit Laufzeit O(n) im schlechtesten Fall, O( n log m m ) im durchschnittlichen Fall. R. Stiebe: Textalgorithmen, WS 2003/04 45
Bad Character Regel Findet man beim ersten Vergleich das Textsymbol x, so darf man P am Ende der Phase so weit verschieben, daß das rechteste Vorkommen von x in P auf diese Textposition trifft. x x y P P x T R. Stiebe: Textalgorithmen, WS 2003/04 46
Good Suffix Regel Teil 1 Stimmt ein Suffix α von P mit dem aktuellen Text überein, so darf man P so weit verschieben, daß das letze Vorkommen von α in P = P [1... m 1] gegenüber dem entsprechenden Text steht. α α α α P P T R. Stiebe: Textalgorithmen, WS 2003/04 47
Good Suffix Regel Teil 2 Sollte ein Vorkommen des Suffixes α nicht existieren, so darf man P so weit verschieben, daß das längste Suffix von α, das ein Präfix von P ist, gegenüber dem Ende des aktuellen Textstückes steht. β β P α β P α β T R. Stiebe: Textalgorithmen, WS 2003/04 48
Boyer-Moore-Verschiebungsregel Tritt im ersten Vergleich ein Mismatch auf, so verschiebe nach der Bad Character Regel. Anderenfalls verschiebe nach der Good Suffix Regel. Bemerkung: Es gibt zahlreiche Varianten, z.b.: Horspool-Algorithmus: Verschiebe stets nach der Bad Character Regel. R. Stiebe: Textalgorithmen, WS 2003/04 49
Formalisierung Definition. Für P Σ mit P = m und x Σ ist R x (P ) := max ({1 i < m : P [i] = x} {0}), d.h., R x (P ) ist das letzte Vorkommen von x in P vor der letzten Stelle von P. Definition. Sei P Σ mit P = m. Für 1 i m sei ( L i (P ) := max {j : m i + 1 j < m P [i... m] = P [j + i m... j]} ) {j : 0 j m i P [m j + 1... m] = P [1... j]} l i (P ) := max{j : 0 j m i P [m j + 1... m] = P [1... j]}, d.h. l i ist die Länge des längsten echten Suffixes von P [i... m], das Präfix von P ist, und L i ist die letzte Position, an der in P [1... m 1] ein Vorkommen von P [i... m] endet, bzw. l i, falls ein solches Vorkommen nicht existiert. R. Stiebe: Textalgorithmen, WS 2003/04 50
Beispiel Für P = ababcbab mit Σ = {a, b, c, d} ergibt sich: x a b c d R x 7 6 5 0 i 1 2 3 4 5 6 7 8 L i 2 2 2 2 2 4 4 6 Dies führt zu folgenden Verschiebungen. Suchwort: ababcbab ababcbab ababcbab Textausschnitt:...d......aab...cabcbab... Verschiebung: 8 4 6 R. Stiebe: Textalgorithmen, WS 2003/04 51
Algorithmus 1.6 Boyer-Moore-Algorithmus Eingabe: Wörter P, T mit P = m, T = n (Die Werte R x und L i für P sind bekannt) Ausgabe: Menge S der Vorkommen von P in T (1) S ; k m; (2) while k n (3) i m; j k; x T [k]; (4) while i 1 and P [i] = T [j] (5) i i 1; j j 1; (6) if i = 0 then S S {k m + 1}; (7) if i = m then k k + m R x ; (8) else k k + m L i+1 ; Satz. Der Boyer-Moore-Algorithmus findet alle Vorkommen von P in T. R. Stiebe: Textalgorithmen, WS 2003/04 52
Boyer-Moore-Präprozessing in Linearzeit Algorithmus 1.7 BM-Präprozessing: R x -Werte Eingabe: Wort P Σ, P = m Ausgabe: R x (P ) für x Σ (1) foreach x Σ (2) R x 0; (3) for i 1 to m 1 (4) x P [i]; R x i; Satz. Die Werte R x (P ) können mit einem Aufwand von O(m + σ) bestimmt werden. R. Stiebe: Textalgorithmen, WS 2003/04 53
BM-Präprozessing l i -Werte Algorithmus 1.8 BM-Präprozessing: l i -Werte Eingabe: Wort P Σ, P = m Ausgabe: l i (P ) für 1 i m (1) Bestimme die Ränder von P und speichere ihre Längen in fallender Reihenfolge als Stack L; (Das oberste Element von L ist Border(P ), das unterste ist 0.) (2) i 1; (3) while L nicht leer (4) l Pop(L); (5) while l m i (6) l i l; i i + 1; Satz. Algorithmus 1.8 berechnet für ein Wort P der Länge m die Werte l i (1 i m) in einer Zeit von O(m). R. Stiebe: Textalgorithmen, WS 2003/04 54
BM-Präprozessing L i -Werte ähnlich zum MP-Algorithmus Verwendung von Rändern (diesmal der Suffixe) offensichtlich: L i (P ) l i (P ) für alle i Definition. Für 1 i P = m sei Border r i (P ) die Länge des längsten Randes von P [i... m]. Offensichtlich: Border r i (P ) = Border m i+1 (P r ), d.h. die Werte Border r i sind in Zeit O(m) berechenbar. R. Stiebe: Textalgorithmen, WS 2003/04 55
Algorithmus 1.9 BM-Präprozessing: L i -Werte Eingabe: Wort P Σ, P = m Ausgabe: L i (P ) für 1 i m (1) Berechne Border r i für 1 i m. (2) for i 1 to m (3) L i l i ; (4) i m; k m 1; j k; (5) while j > 0 (6) while j > 0 and P [i] = P [j] (7) if L i < k then L i k; (8) i i 1; j j 1; (9) if j = k then k j 1; j k; i m; (10) else k j + Border r i+1; i m Border r i+1; Satz. Algorithmus 1.9 berechnet für ein Wort P der Länge m die Werte L i (1 i m) in einer Zeit von O(m). R. Stiebe: Textalgorithmen, WS 2003/04 56
Laufzeit im schlechtesten Fall Θ(mn) für P = a m, T = a n Laufzeit beträgt Θ(n), falls P nicht in T vorkommt (Knuth, Morris, Pratt) Beweis: siehe [Gusfield], Abschnitt 3.2 lineare Laufzeit bei Beachtung der folgenden Regel Regel von Galil Wurde ein Vorkommen von P in T gefunden, so prüfe in der nächsten Phase höchstens die letzten Per(P ) Zeichen. R. Stiebe: Textalgorithmen, WS 2003/04 57
Durchschnittliche Laufzeit des Boyer-Moore-Algorithmus Der Einfachheit halber Betrachtung des Horspool-Algorithmus (Verschiebung immer nach der Bad Character Regel) Comp(m) mittlere Anzahl der Vergleiche in einer Phase Wie bei Naivem Algorithmus: Comp(m) σ σ 1. Shift(m) mittlere Verschiebung nach einer Phase Mittlere Laufzeit: t(m, n) n Comp(m) Shift(m). R. Stiebe: Textalgorithmen, WS 2003/04 58
Mittlere Verschiebung Shift(m) Shift(m) = m 1 i=0 p i (i + 1) p i : Wahrscheinlichkeit, daß R x (P ) = m 1 i für zufälliges x Σ und P Σ k. p i = ( ) σ 1 i σ 1 σ für 0 i m 2, p m 1 = ( ) σ 1 m 1 σ Rechnung analog zum Naiven Algorithmus ergibt: Shift(m) σ ( 1 ( 1 1 σ) m ). Folgerung. Shift(m) = Θ(min{σ, m}). Für σ = 100 erhalten wir beispielsweise: m 2 10 50 100 200 1000 Shift(m) 1.99 9.6 39.5 63.4 86.6 99.996 R. Stiebe: Textalgorithmen, WS 2003/04 59
Erweiterte Bad Character Regel Bestimme letztes Vorkommen in P für jedes Wort aus Σ q, q 1. Bestimme in jeder Phase die letzten q Textzeichen β und verschiebe P bis zum letzten Vorkommen von β. Definition. Für q 1, α Σ q, P Σ, P = m q sei R α (P ) die rechteste Stelle in P = P [1... m 1], an der ein Vorkommen von α endet oder die Länge des längsten Suffixes von α, das Präfix von P ist, falls α nicht in P auftritt. Erweiterte Bad Character Regel Ergeben die q letzten aktuellen Textzeichen das Wort α, so verschiebe um den Betrag m R α (P ). R. Stiebe: Textalgorithmen, WS 2003/04 60
Erweiterte Bad Character Regel Beispiel P = abaababb, q = 3 α aaa aab aba abb baa bab bba bbb R α 1 5 6 0 4 7 1 0 mittlere Verschiebung für P : (7 + 3 + 2 + 8 + 4 + 1 + 7 + 8)/8 = 5. R. Stiebe: Textalgorithmen, WS 2003/04 61
Erweiterte Bad Character Regel Laufzeit Zeit für Präprozessing: Θ(m + σ q ) Durchschnittliche Zeit für die Suche Comp(m) q, Shift(m) = Θ(min{m, σ q }) n q t(m, n) = Θ( Optimale Wahl min{m,σ q } ) q = log σ m: t(m, n) = Θ( n log m m ) R. Stiebe: Textalgorithmen, WS 2003/04 62
1.6 Apostolico-Giancarlo-Algorithmus Variante des Boyer-Moore-Algorithmus Vergleiche werden eingespart, indem einige gefundene Übereinstimmungen mit dem Text gespeichert werden. Laufzeit im schlechtesten Fall: Θ(n) (relativ einfach nachweisbar) R. Stiebe: Textalgorithmen, WS 2003/04 63
Zusätzliches Präprozessing N-Werte Definition. Es sei P ein Wort der Länge m. Für 1 i m 1 sei N i (P ) die Länge des längsten Suffixes von P, das Suffix von P [1... i] ist. Offensichtlich: N i (P ) = Z m i+1 (P r ) für P = m. Beispiel. Für P = ababcbab erhält man i 1 2 3 4 5 6 7 N i 0 2 0 3 0 1 0 R. Stiebe: Textalgorithmen, WS 2003/04 64
Speicherung gefundener Übereinstimmungen Jeder Stelle j des Textes wird ein Wert M j zugeordnet, der mit 0 initialisiert ist. Wird in einer Phase des Algorithmus die Stelle k als Ende eines Vorkommens getestet, so wird M k am Ende der Phase derart modifiziert, daß folgende Bedingungen erfüllt sind. (*) P [m M k + 1... m] = T [k m k + 1... k]. (**) Für alle k M k < j < k gilt j M j k M k. R. Stiebe: Textalgorithmen, WS 2003/04 65
Ein Schritt im Algorithmus In einer Phase sei bisher die Übereinstimmung P [i + 1... m] = T [j + 1... n] festgestellt worden. M j = 0: expliziter Vergleich von P [i] und T [j] (Fälle 1,2) Wir werden zeigen: j liegt in keinem Intervall [l M l + 1, l]. M j 0: kein expliziter Vergleich; weiteres Vorgehen ergibt sich aus N i und M j (Fälle 3,4,5) Fall 1: M j = 0 und P [i] = T [j] Die Phase wird fortgesetzt. i i 1; j j 1; Fall 2: M j = 0 und P [i] T [j]. Die Phase wird beendet; Verschiebung wie beim Boyer-Moore-Algorithmus. Anpassung von M k : M k k j R. Stiebe: Textalgorithmen, WS 2003/04 66
Fall 3: N i M j P T Es gilt P [i M j + 1... i] = T [j M j + 1... j]. Die nächsten M j Vergleiche darf man auslassen. i i M j ; j j M j ; R. Stiebe: Textalgorithmen, WS 2003/04 67
Fall 4: M j > N i = i P T Es gilt P [1... i] = T [j i + 1... j], d.h. ein Vorkommen von P wurde gefunden. Ende der Phase. Verschiebung wie beim Boyer-Moore-Algorithmus. M k k j; (um Bedingung (**) zu erfüllen). R. Stiebe: Textalgorithmen, WS 2003/04 68
Fall 5: M j > N i i > N i P T Es gilt P [i N i + 1... i] = T [j N i + 1... j] und P [i N i ] T [j N i ], d.h. das erste Mismatch für die Position k besteht zwischen P [i N i ] und T [j N i ]. Ende der Phase. Verschiebung wie beim Boyer-Moore-Algorithmus i i N i ; M k k j; R. Stiebe: Textalgorithmen, WS 2003/04 69
Algorithmus 1.10 Apostolico-Giancarlo-Algorithmus Eingabe: Wörter P, T mit P = m, T = n (Die Werte R x, L i und N i für P sind bekannt) Ausgabe: Menge S der Vorkommen von P in T (1) Initialisiere M j 0 für 1 j n; (2) S ; k m; (3) while k n (4) i m; j k; x T [k]; stop false ; (5) while i 1 and not stop (6) if T j = 0 and P [i] = T [j] then i i 1; j j 1; (7) if T j = 0 and P [i] T [j] then stop true ; (8) if T j 0 and N i M j then i i M j ; j j M j ; (9) if T j 0 and M j > N i = i then i 0; (10) if T j 0 and M j > N i and i > N i then i i N i ; stop true ; (11) M k k j; if i = 0 then S S {k m + 1}; (12) if i = m then k k + m R x ; (13) else k k + m L i+1 ; R. Stiebe: Textalgorithmen, WS 2003/04 70
Korrektheit und Laufzeit des Algorithmus Lemma. 1. Vor und nach jedem Schritt gilt (a) P [i + 1... m] = T [k m + i + 1... k] und m i k j, (b) j l M l für alle l > j. 2. Zu jedem Zeitpunkt erfüllen die Werte von M 1, M 2,..., M n die Bedingungen (*) und (**). 3. Am Ende jeder Phase ist der Wert von i die Stelle in P mit dem ersten Mismatch. Satz. Der Apostolico-Giancarlo-Algorithmus findet alle Vorkommen von P in T mit einer Laufzeit von O(m). R. Stiebe: Textalgorithmen, WS 2003/04 71