12.02.2014 Aufrufe

Algorithmus von Boyer und Moore

Algorithmus von Boyer und Moore

Algorithmus von Boyer und Moore

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!