4. Textalgorithmen Arten von String-Matching-Problemen ...
4. Textalgorithmen Arten von String-Matching-Problemen ...
4. Textalgorithmen Arten von String-Matching-Problemen ...
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