Algorithmus von Boyer und Moore
Algorithmus von Boyer und Moore
Algorithmus von Boyer und Moore
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
+<br />
+<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
Der <strong>Algorithmus</strong> <strong>von</strong> <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
Der <strong>Algorithmus</strong> <strong>von</strong> <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong> kann als eine verbesserte Variante<br />
eines naiven String-Matching-<strong>Algorithmus</strong> angesehen werden, bei<br />
dem ¢¡¤£ mit £¦¥¨§©£ <strong>von</strong> rechts nach links verglichen wird.<br />
<strong>Algorithmus</strong> 1.6. [naives String-Matching <strong>von</strong> rechts nach links]<br />
<br />
while <br />
do<br />
<br />
while and ¢¡¤£¨ ¤ ! £¦¥¨§©£" #$%&'<br />
if then return true<br />
* )<br />
do (% end<br />
<br />
! <br />
end<br />
return false<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 37<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
Der <strong>Algorithmus</strong> <strong>von</strong> <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong> basiert auf der folgenden Überlegung:<br />
Tritt in <strong>Algorithmus</strong> 1.6 an Stelle ein Mismatch auf <strong>und</strong> kommt<br />
<br />
, -.-/-0,<br />
nicht ein weiteres mal in als Substring vor,<br />
¢¡¤£"<br />
so<br />
kann gleich um Zeichen nach rechts verschoben werden.<br />
<br />
1¡2£<br />
¢¡¤£<br />
Vergleicht man dagegen <strong>von</strong> links nach rechts, kann ¢¡¤£ nach einem<br />
Mismatch an Position nie um mehr als Positionen nach rechts<br />
verschoben werden (vgl. <strong>Algorithmus</strong> 1.2).<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 38
(BM1) für alle >DE; FD,G@ oder ¢¡¤£¨ DHI@' 9 ¢¡¤£" DF<br />
(BM2)<br />
¢¡¤£" %:@. = ¢¡¤£¨ ¤<br />
@B>J)LK<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
Veranschaulichung:<br />
naechstmoeglicher Match<br />
Mismatch<br />
Vergleich<br />
Pattern<br />
1<br />
j<br />
m<br />
Text<br />
? ? ? ?<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 39<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
Kommt es in <strong>Algorithmus</strong> 1.6 an der Stelle <strong>von</strong> ¢¡¤£ zu einem Mismatch,<br />
so gilt<br />
+3 ¢¡¤£" 45-/-/-0, # £0¥/§6£¨ #78-/-/-09: ;'<br />
<strong>und</strong><br />
¢¡¤£" < = +3<br />
#7%;'<br />
.<br />
£0¥¨§©£¨<br />
Dies kann wie folgt ausgenutzt werden: Angenommen, tritt in an<br />
einer Position auf. Dann müssen die beiden folgenden<br />
Bedingungen gelten:<br />
>?A@B>&C7<br />
£0¥¨§©£ ¢¡¤£<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 40
N<br />
<br />
%:@<br />
M<br />
N<br />
<br />
N<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
Veranschaulichung:<br />
pat:<br />
- - - - a b c b c<br />
pat:<br />
- - - - a b c b c<br />
text: - - - - - - a b c a b c - - - - -<br />
97%;<br />
Damit man keinen Match verpaßt, muß<br />
gewählt werden.<br />
@<br />
wiederum möglichst klein<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 41<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
Veranschaulichung:<br />
naechstmoeglicher Match<br />
Mismatch<br />
Vergleich<br />
Pattern<br />
1<br />
j<br />
m<br />
Text<br />
? ? ? ?<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 42
O<br />
O<br />
O<br />
¤ PQSRUT <br />
VXW!Y6Z<br />
O<br />
(BM1) <strong>und</strong> (BM2) gilt für <strong>und</strong> @^]<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
Die entsprechenden Werte werden in einer Preprocessingphase ermittelt<br />
<strong>und</strong> in der Shift-Tabelle O abgelegt.<br />
@\[<br />
O<br />
<<br />
Der <strong>Algorithmus</strong> <strong>von</strong> <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong> verwendet nun im Falle eines<br />
Mismatches an Position den in abgelegten Wert, um nach<br />
rechts zu verschieben.<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 43<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
<strong>Algorithmus</strong> 1.7. [<strong>Algorithmus</strong> <strong>von</strong> <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong>]<br />
<br />
while <br />
do<br />
<br />
while and ¢¡¤£¨ ¤ ! £¦¥¨§©£" #$%&'<br />
if then return true<br />
* )<br />
do (% end<br />
<br />
end<br />
return false<br />
<br />
!<br />
¤<br />
Beispiel 1.4.<br />
lautet für _a` :<br />
¤ ¢¡¤£¨<br />
¤ <br />
1 2 3 4 5 6 7 8 9 10 11 12 13<br />
a b a a b a b a a b a a b<br />
8 8 8 8 8 8 8 3 11 11 6 13 1<br />
<<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 44
+<br />
+<br />
+<br />
b<br />
b<br />
O<br />
b<br />
b<br />
b<br />
O<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
<strong>Algorithmus</strong> 1.7 kann noch weiter verbessert werden: Tritt an Stelle<br />
<strong>von</strong> <br />
(also bereits beim ersten Vergleich) ein Mismatch auf, so wird<br />
1¡2£<br />
nur um eine Stelle nach rechts verschoben.<br />
¢¡¤£<br />
Es sei<br />
<strong>und</strong><br />
@ e QSfhg<br />
¡ 4[ £¨dc ¢¡¤£" < 9 c ]<br />
iXj?k¨jml Z<br />
falls nicht in auftritt.<br />
¢¡¤£ c<br />
@ e* £¨dc ¡<br />
@<br />
gibt für ein die jeweils letzte Position <strong>von</strong> in an. Kommt<br />
¢¡¤£ ¡ £¨dc<br />
es nun an Stelle zu einem Mismatch, kann c statt<br />
con$p<br />
<br />
!<br />
¤<br />
die Anweisung<br />
!IQqfrgts<br />
< vuw%<br />
¡ @ £¨x£0¥¨§©£¨ #7%;y U {z<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 45<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
verwendet werden. Damit ergeben sich noch größere Verschiebungen.<br />
Bemerkungen:<br />
Verschiebungen der Länge<br />
Shift.<br />
|<br />
¡ @ £"x£¦¥¨§©£" /^|E' U<br />
heißen Occurrence-<br />
Wird nur der Occurence-Shift verwendet, d.h. die Verschiebeanweisung<br />
lautet<br />
¡ @ £"£0¥¨§©£" #7%;' € {z<br />
G#:QqfhgPs}~uv%<br />
so spricht man <strong>von</strong> einem vereinfachten <strong>Boyer</strong>-<strong>Moore</strong>-<strong>Algorithmus</strong>.<br />
Die Worst-Case-Laufzeit des vereinfachten <strong>Boyer</strong>-<strong>Moore</strong>-<strong>Algorithmus</strong><br />
s‚9ƒz<br />
beträgt .<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 46
+<br />
+<br />
1. Suche <strong>von</strong> Mustern <strong>Boyer</strong> <strong>und</strong> <strong>Moore</strong><br />
Auf gewöhnlichen Texten verhält sich die vereinfachte Version i.d.R.<br />
nur marginal schlechter als die ursprüngliche Version.<br />
Bei kleinem [ p [<br />
ist die Occurence-Heuristik i.d.R. nutzlos.<br />
Textalgorithmen — FH Bonn-Rhein-Sieg, SS 02 47