Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

G.Heyer Algorithmen und Datenstrukturen II 1 Suche in Texten (Stringsuche ) Gegeben: Text T[1..n]; Pattern P[1..m] Gesucht: Stelle, an der Pattern im Text.

Ähnliche Präsentationen


Präsentation zum Thema: "G.Heyer Algorithmen und Datenstrukturen II 1 Suche in Texten (Stringsuche ) Gegeben: Text T[1..n]; Pattern P[1..m] Gesucht: Stelle, an der Pattern im Text."—  Präsentation transkript:

1 G.Heyer Algorithmen und Datenstrukturen II 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 TRUE1 #define FALSE0 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 G.Heyer Algorithmen und Datenstrukturen II 2 Problem: (1) Verringerung Fehlstarts (2) effiziente Behandlung von Wiederholungen Lösungsansatz (1): String Matching mit endlichen Automaten Ein endlicher Automat besteht aus: Alphabet Menge von Zuständen Z Anfangszustand z 0 Endzustand z e Überführungsfunktion : Z x -> Z, ordnet jedem Zustand Nachfolgezustand nach Lesen eines Symbols zu. hier: Automat mit Zuständen {0,...,m}, z 0 = 0, z e = m; Zustand j bedeutet: Anfangsstück des Patterns der Länge j wurde gelesen.

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

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

5 G.Heyer Algorithmen und Datenstrukturen II 5 Knuth-Morris-Pratt Algorithmus Statt endlichem Automaten (mit | | * (m+1) Einträgen) wird eindimensionale "Verschiebe"-Tabelle mit m Einträgen verwendet. Verschiebetabelle [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): [q] = max{ k < q | P[1.. k] = P [q-k+1.. q ] } [q ]=j bedeutet: die letzten j Positionen sind möglicherweise richtig Pattern kann bei mismatch jeweils um q - [q] Positionen nach rechts verschoben werden. ( [q] te Position im Pattern wird an aktuelle Position geschoben)

6 G.Heyer Algorithmen und Datenstrukturen II 6 Beispiel q: P:k a k a o 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 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 G.Heyer Algorithmen und Datenstrukturen II 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 G.Heyer Algorithmen und Datenstrukturen II 8 Algorithmus: Berechne Verschiebetabelle [1..m] ; q = 0 ; for (i = 1; i = n; i++) { while ((q > 0) && (P [q+1]!=T[i] ) ) q = [q]; if (P[q+1] == T[i] ) q = q+1; if (q == m) { printf (%d, i-m) ; q = [q] ; } i : aktuelle Textposition q: Anzahl übereinstimmender Zeichen m :Patternlänge n:Textlänge

9 G.Heyer Algorithmen und Datenstrukturen II 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 = , , , 0Ausgabe s =

10 G.Heyer Algorithmen und Datenstrukturen II 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 G.Heyer Algorithmen und Datenstrukturen II 11 Aufbau Verschiebetabelle: [1] = 0 ; k = 0 ; for (q = 2 ; q= m ; q++) { while (( k > 0) && (P[k+1]!= P[q]) ) k = [k]; if (P[k+1] == P[q] ) k = k+1; [q] = k ; } Beispiel: k a k a o nach for-Schleife mit q = ist PI[q] = Ähnliches Argument wie oben zeigt, daß Schrittzahl mit 2m abgeschätzt werden kann. Damit Komplexität KMP-Algorithmus insgesamt O(m+n).

12 G.Heyer Algorithmen und Datenstrukturen II 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 G.Heyer Algorithmen und Datenstrukturen II 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 = a n und P = a m.


Herunterladen ppt "G.Heyer Algorithmen und Datenstrukturen II 1 Suche in Texten (Stringsuche ) Gegeben: Text T[1..n]; Pattern P[1..m] Gesucht: Stelle, an der Pattern im Text."

Ähnliche Präsentationen


Google-Anzeigen