170 likes | 311 Views
Time- space -Optimal String Matching nach Zvi Galil und Joel Seiferas. Chris Schwiegelshohn Katja Losemann. Stringalgorithmus. Geg.: Suchtext y und Muster x p Position im Suchtext und q Position im Muster Init : p=0 und q=0
E N D
Time-space-Optimal String Matchingnach ZviGalilund Joel Seiferas Chris Schwiegelshohn Katja Losemann
Stringalgorithmus • Geg.: Suchtext y und Muster x • p Position im Suchtext und q Position im Muster • Init: p=0 und q=0 loop{ while y(p + q + 1) == x(q + 1) do q = q +1; p = p‘;q = q‘; } gotoloop
Varianten • Nur über Berechnung von p‘ und q‘! • Naiv: • p‘ = p + 1 und q‘ = q + 1 • Knuth-Morris-Prat berechnet p‘ = p + shiftx(q) und q‘ = q - shiftx(q), wobei • shiftx(q) = min{shift > 0 |[shift,q] x= [0,q-shift]x}
Aufwand von String Matching • String-matching Algorithmen: • Entweder: in linearer Zeit (Knuth-Morris) Oder: ohne Speicherplatzbedarf (naiv) • Jetzt: Beides
Terminologie • k: beliebig, fest und hinreichend groß • z und w Strings • w(i): i-ter Buchstabe von Wort w • z ist Periode von w, wenn w Präfix von z∞ • z ist einfach, wenn für kein i>1 z‘i= z gilt • z ist Präfix-Periode von w, wenn w einfach ist und zk ein Präfix von w ist,
Beispiele • (ab) 3= ababab ist nicht einfach • abababa ist dagegen einfach • Beide Strings haben dieselben Perioden ab, abab, ababab und sogar abababa • String w = (abababa) k ∘ abab besitzt mit k>=4 die Präfix-Periodeabababa und mit k=3 auch ab
Weitere Terminologie • Gegeben String w und p <= |w| • Funktion reachw(p): • reachw(p) = max{q‘ <= |w| | [0,p] wist Periode von [0,q‘]w}
Beispiele • String w = (abababa) k ∘ abab • reachw(1) = 1 • reachw(2) = 7 • reachw(7) = |w|
Stringalgorithmus Geg.: Suchtext y und Muster x p Position im Suchtext und q Position im Muster Init: p=0 und q=0 loop{ while y(p + q + 1) == x(q + 1) do q = q +1; p = p‘;q = q‘; } gotoloop
Neue Definition • (p‘,q‘) = (p + shiftx(q), q – shiftx(q)), wenn shiftx (q) ≤ q/k = (p + max(1, ⌈q/k⌉), 0) sonst • Fall 1 benötigt zusätzlichen Speicherplatz! • Können wir den Fall 1 vermeiden?
Vorgehen • Leider nicht ganz • Ist k groß, dann sollte der erste Fall relativ selten vorkommen. • Es lässt sich ein Zusammenhang zwischen der Häufigkeit von shiftx (q) ≤ q/k und Präfix-Perioden des Suchmusters x erstellen.
Vorkommen von shiftx(q) ≤ q/k • Lemma 1: • Wenn shiftx(q)<=q/k , dann [0, shiftx(q)] x Präfix-Periode von x. • Lemma 2: • Wenn [0, shiftx(q)] x Präfix-Periode von x, dann shift = shiftx(q) <= q/k k * shift <= q <= reachx (shift)
Suche nach einem festen Muster • Dekompositions Theorem:Jedes Muster x kann in Strings u und v aufgeteilt werden, so dass x = uv und v hat maximal eine Präfix-Periode und |u| = O(shiftv( |v| )) • Beweis: Klemmen wir uns
Die große Zusammenführung 1 • Idee des Algorithmusist, nachVorkommen von Suffix vzusuchen • Fall 1: v hat keinePräfix-Periode ⇒ Wegen Lemma 1 kannshiftx (q) ≤ q/k nicht eintreten ⇒ ( p‘ , q‘ ) = ( p + max ( 1 , ⌈q/k⌉ , 0 )
Die große Zusammenführung 2 • Fall 2: v hat genaueinePräfix-PeriodederLänge p1. • Wegen Lemma 2 gilt shiftx (q) ≤ q/k genau dann wenn k ⋅ p1≤ q ≤ reachv(p1) • Also gilt: ( p‘ , q‘ ) = ( p + shiftx(q) , q - shiftx(q) ) = ( p + p1, q – p1 )
Laufzeit und Analyse • Suchenach Suffix v: • f(p,q) = a1 * p + a2 * q = O(|y| + |v|) • Wähle a1 und a2geschickt, so dass die Funktion linear steigt • Suchenach u: • Wegen des DekompositionsLemmaskann u in y nur |y| / shift(v) häufigvorkommen und somit in O(|y|). Suchedahernaiv. • Insgesamt: O(|v| + |y|) = O(|x| + |y|)
Laufzeit und Analyse • Speicherplatzbedarf: • Da wir nur eine Präfix Periode haben konstant! • FERTIG !