16.01.2015 Aufrufe

4. Textalgorithmen Arten von String-Matching-Problemen ...

4. Textalgorithmen Arten von String-Matching-Problemen ...

4. Textalgorithmen Arten von String-Matching-Problemen ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>4.</strong> <strong>Textalgorithmen</strong> <strong>String</strong> <strong>Matching</strong>: Morris und Pratt<br />

Veranschaulichung:<br />

pat: a b c a - - - - -<br />

pat: a b c a b c d - - - - -<br />

text: - - - - - a b c a b c a - - - - -<br />

↑ ↑ ↑<br />

i i + s i + j − 1<br />

s ist hier der Betrag, um den pat nach rechts verschoben wird.<br />

Nach einem Mismatch an Position j <strong>von</strong> pat kann nur dann an i + s ein<br />

Match vorliegen, wenn pat[1 . . . j − s − 1] ein Suffix <strong>von</strong> pat[1 . . . j − 1]<br />

ist.<br />

Mit k := j − s folgt: pat[1 . . . k − 1] ist Suffix <strong>von</strong> pat[1 . . . j − 1].<br />

<strong>4.</strong> <strong>Textalgorithmen</strong> <strong>String</strong> <strong>Matching</strong>: Morris und Pratt<br />

• Man ermittle in einer Preprocessingphase zu jedem 1 ≤ j ≤ m das<br />

größte k, so daß pat[1 . . . k − 1] echter Suffix <strong>von</strong> pat[1 . . . j − 1] ist.<br />

Der entsprechende Betrag wird mit border[j] bezeichnet.<br />

border[j] :=<br />

bzw.<br />

border[j] :=<br />

max {k | pat[1 . . . k − 1] = pat[j − k + 1 . . . j − 1]}<br />

1≤k≤j−1<br />

max {k | pat[1 . . . k−1] ist echter Suffix <strong>von</strong> pat[1 . . . j−1]}<br />

1≤k≤j−1<br />

Weiterhin gelte border[1] = 0<br />

• Im Algorithmus schiebe man bei einem Mismatch an Position j des<br />

Pattern dieses um s = j − border[j] Stellen nach rechts.<br />

Information Retrieval — FH Bonn-Rhein-Sieg, SS 06 170<br />

Information Retrieval — FH Bonn-Rhein-Sieg, SS 06 172<br />

<strong>4.</strong> <strong>Textalgorithmen</strong> <strong>String</strong> <strong>Matching</strong>: Morris und Pratt<br />

Veranschaulichung:<br />

Text<br />

Pattern<br />

s<br />

naechstmoeglicher Match<br />

Mismatch<br />

1 j<br />

Damit man keinen Match verpaßt, muß s möglichst klein und somit k<br />

möglichst groß gewählt werden.<br />

Konsequenzen für einen verbesserten Algorithmus:<br />

<strong>4.</strong> <strong>Textalgorithmen</strong> <strong>String</strong> <strong>Matching</strong>: Morris und Pratt<br />

• Durch die Maximalität ist s ein “safe shift”.<br />

Algorithmus <strong>4.</strong>2. [Morris und Pratt]<br />

i := 1; j := 1<br />

while i ≤ n − m + 1 do<br />

while j ≤ m and pat[j] = text[i + j − 1] do<br />

j := j + 1<br />

end<br />

if j = m + 1 then return true<br />

i := i + j − border[j]<br />

j := max(border[j], 1)<br />

end<br />

return false<br />

(A)<br />

(B)<br />

Information Retrieval — FH Bonn-Rhein-Sieg, SS 06 171<br />

Information Retrieval — FH Bonn-Rhein-Sieg, SS 06 173

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!