Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Suche in Texten (Stringsuche )

Ähnliche Präsentationen


Präsentation zum Thema: "Suche in Texten (Stringsuche )"—  Präsentation transkript:

1 Suche in Texten (Stringsuche )
Gegeben: Text T[1..n]; Pattern P[1..m] Gesucht: Stelle, an der Pattern im Text vorkommt. P kommt in T mit shift s vor, wenn gilt: T[s+1,...,s+m] = P[1,...,m] Naiver Algorithmus: #define TRUE 1 #define FALSE 0 for (s = 0 ; s = n-m ; s++) if (stringtest(s)) return (s) /* s ist gesuchter shift */ stringtest (int s) { int j , test; test = TRUE; for (j= 1 ; j= m; j++) if (P[j] != T[s+j]) test = FALSE; return (test); } Komplexität: O((n-m+1) * m) = O(n * m)

2 Problem:. (1) Verringerung Fehlstarts
Problem: (1) Verringerung Fehlstarts (2) effiziente Behandlung von Wiederholungen Lösungsansatz (1): String Matching mit endlichen Automaten Ein endlicher Automat besteht aus: Alphabet S Menge von Zuständen Z Anfangszustand z0 Endzustand ze Überführungsfunktion d: Z x S-> Z, ordnet jedem Zustand Nachfolgezustand nach Lesen eines Symbols zu. hier: Automat mit Zuständen {0,...,m}, z0 = 0, ze = m; Zustand j bedeutet: Anfangsstück des Patterns der Länge j wurde gelesen.

3 Definition: d: d(j,a) = max{k  i | P[1..k] ist Endstück von P[1..i]a, falls Maximum existiert 0 sonst Beispiel: S = {a,o,k}, P = kakao Z = {0,1,2,3,4,5} Folgender Automat erkennt L = S*kakao

4 Algorithmus: Konstruiere den P entsprechenden Automaten; z = 0; for (i = 1 ; i = n ; i++ ) { z = d(z, T[i]) ; if (z == m) Ausgabe ( i - m ) ; } Man kann zeigen: Algorithmus ist O(|S|m + n) erster Summand Erzeugung des Automaten. Es existieren noch effizientere Verfahren.

5 Knuth-Morris-Pratt Algorithmus
Statt endlichem Automaten (mit |S| * (m+1) Einträgen) wird eindimensionale "Verschiebe"-Tabelle mit m Einträgen verwendet. Verschiebetabelle P [1 .. m] gibt an, wie weit gesuchtes Pattern beim Vergleich im Falle eines mismatches verschoben werden kann (Endstück könnte Anfang des gesuchten Patterns sein): P [q] = max{ k < q | P[1 .. k] = P [q-k+1 .. q ] } P [q ]=j bedeutet: die letzten j Positionen sind möglicherweise richtig Pattern kann bei mismatch jeweils um q -P [q] Positionen nach rechts verschoben werden. (P [q] te Position im Pattern wird an aktuelle Position geschoben)

6 Beispiel q: P: k a k a o P: Beispiel: k a k a a k a k a k a o k a k a k a o mismatch 5, schiebe 2 k a k a o mismatch 5, schiebe 2 k a k a o mismatch 5, schiebe 1 k a k a o mismatch 10,schiebe 2 k a k a o match 12,verschiebe 5 k a k a o

7 Bemerkung zur Komplexität:
In jedem Schritt wird entweder die aktuelle Position oder das Pattern nach rechts verschoben. Das kann insgesamt höchstens 2n mal passieren, damit ist der Algorithmus O(n).

8 Algorithmus: Berechne Verschiebetabelle P [1..m] ; q = 0 ; for (i = 1; i = n; i++) { while ((q > 0) && (P [q+1]!=T[i] ) ) q = P [q]; if (P[q+1] == T[i] ) q = q+1; if (q == m) printf („%d“, i-m) ; q = P [q] ; } i : aktuelle Textposition q: Anzahl übereinstimmender Zeichen m : Patternlänge n: Textlänge

9 Beispiel: k a k a a k a k a k a o k a k a k a o nach for-Schleife mit i = ist q = 1 1 2 2 3 3 4 4 5 2, 0 6 1 7 2 8 3 9 4 , 3 , 0 Ausgabe s = 7 14 2

10 Komplexität: W- in F-Schleife, sieht aus nach O(nm), ist aber besser: Mehrfachausführung der while-Schleife selten. Grund: Wert von q geht in jeder F-Schleife entweder in 1-er-Schritt hoch, oder in while-Schleife runter (auf 0 oder auf Zwischenwert + 1, siehe 10). In jedem Fall geht jedem Durchlauf der W-Schleife mindestens ein Durchlauf der F-Schleife voraus, in dem q um 1 erhöht wurde. Damit ist Anzahl von F+W-Schleifendurchläufen durch 2n beschränkt.

11 Aufbau Verschiebetabelle:
P[1] = 0 ; k = 0 ; for (q = 2 ; q= m ; q++) { while (( k > 0) && (P[k+1]!= P[q]) ) k = P [k]; if (P[k+1] == P[q] ) k = k+1; P[q] = k ; } Beispiel: k a k a o nach for-Schleife mit q = ist PI[q] = 2 0 3 1 4 2 5 0 Ähnliches Argument wie oben zeigt, daß Schrittzahl mit 2m abgeschätzt werden kann. Damit Komplexität KMP-Algorithmus insgesamt O(m+n).

12 Boyer-Moore Algorithmus
Erweist sich in Praxis als schnellster Algorithmus. Idee: Pattern wird am Text "langgeschoben". Diesmal wird Übereinstimmung vom rechten zum linken Patternrand überprüft. Mismatches führen zu Verschiebungen des Patterns nach rechts. Mögliche Verschiebungen werden anhand von 2 Strategien ermittelt: 1) bad character Strategie: Sei i der Character, der beim Vergleich von rechts nach links mismatch bewirkt hat. Suche das im Pattern am weitesten rechts vorkommende i und verschiebe Pattern so weit nach rechts, bis dieses i und der bad character zur Deckung kommen.

13 2) good suffix Strategie:
Suche das im Pattern am weitesten rechts vorkommende rechte Teilstück des Patterns, das bis zu mismatch mit dem Text matchte. Bringe dieses Teilstück mit dem Text in Deckung. BM-Algorithmus bestimmt den nach beiden Strategien erlaubten größten Sprung und wendet ihn an. Dazu werden wieder 2 Verschiebetabellen verwendet. BM im Mittel sehr schnell. Worst case aber O(mn). Tritt ein, wenn T = an und P = am.


Herunterladen ppt "Suche in Texten (Stringsuche )"

Ähnliche Präsentationen


Google-Anzeigen