03.06.2014 Aufrufe

Algorithmus Boyer - Moore Bestimmung der last-Funktion

Algorithmus Boyer - Moore Bestimmung der last-Funktion

Algorithmus Boyer - Moore Bestimmung der last-Funktion

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.

<strong>Algorithmus</strong> <strong>Boyer</strong> - <strong>Moore</strong><br />

(Suchen <strong>der</strong> Positionen aller Auftreten des Pattern)<br />

Es gelte<br />

<strong>last</strong>[a] = max{0} ∪ {k | p[k] = a, 1 ≤ k ≤ m} und<br />

shift[i] = min {t | t ≥ 1 und (t ≥ i o<strong>der</strong> p[i − t] ≠ p[i])<br />

und ((t ≥ k o<strong>der</strong> p[k − t] = p[k]) für i < k ≤ m)}<br />

j := 0; /* Zeiger in den Eingabestring s[1..n] */<br />

while j ≤ n-m do<br />

begin<br />

i := m; /* Zeiger in das Pattern p[1..m] */<br />

while i > 0 and p[i] = s[j+i] do<br />

i := i-1;<br />

/* Vergleichen des Patterns mit dem Text */<br />

/* von rechts nach links */<br />

if i = 0 then<br />

/* Pattern gefunden */<br />

begin<br />

print j+1;<br />

j := j + shift[0];<br />

end<br />

else<br />

/* Verschieben des Patterns nach rechts */<br />

/* entsprechend <strong>der</strong> shift- und <strong>last</strong>-<strong>Funktion</strong> */<br />

end<br />

j := j + max(shift[i], i-<strong>last</strong>[s[j+i]]);<br />

<strong>Bestimmung</strong> <strong>der</strong> <strong>last</strong>-<strong>Funktion</strong><br />

(Es sei eine entsprechende Kodierung <strong>der</strong> Symbole aus Σ vorausgesetzt)<br />

for all c in Sigma do<br />

<strong>last</strong>[c] := 0;<br />

for i := 1 to m do<br />

<strong>last</strong>[p[i]] := i;


<strong>Algorithmus</strong> zur <strong>Bestimmung</strong> <strong>der</strong> shift-<strong>Funktion</strong> (<strong>Boyer</strong>-<strong>Moore</strong>)<br />

/* zunächst maximale Verschiebung annehmen */<br />

for i := 0 to m do shift[i] := m;<br />

/* Hilfsarray f mit f[j] = m-|Rand(p[j+1..m])| und */<br />

/* f[m] = m+1 */<br />

/* Berechnung <strong>der</strong> shift-<strong>Funktion</strong> für Situation 1 */<br />

j := m;<br />

k := m+1;<br />

while j > 0 do<br />

begin<br />

f[j] := k; /* für j < m ist k = m-|Rand(p[j+1..m])| */<br />

while k ≤ m and p[j] ≠ p[k] do<br />

begin<br />

shift[k] := min(shift[k], k-j);<br />

k := f[k];<br />

end;<br />

j := j-1;<br />

k := k-1;<br />

end;<br />

/* an dieser Stelle ist k = m-|Rand(p)| */<br />

/* Ende <strong>der</strong> Phase 1 */<br />

/* Berechnung <strong>der</strong> shift-<strong>Funktion</strong> für Situation 2 */<br />

for i := 0 to k do shift[i] := min(shift[i], k);<br />

/* Ende <strong>der</strong> Phase 2 */<br />

/* Berechnung <strong>der</strong> shift-<strong>Funktion</strong> falls <strong>der</strong> Fehler */<br />

/* im Suffix Rand(p) auftritt */<br />

j := k<br />

k := f[k];<br />

while j ≤ m do<br />

begin<br />

while j ≤ k do<br />

begin<br />

shift[j] := min(shift[j], k);<br />

j := j+1;<br />

end;<br />

k := f[k];<br />

end;<br />

/* Ende Phase 3 */


Beispiel für das <strong>Boyer</strong>-<strong>Moore</strong> Verfahren<br />

Es ist i 0 1 2 3 4 5 6 7 8<br />

p[i] G C A G A G A G<br />

shift[i] 7 7 7 7 2 7 4 7 1<br />

und<br />

c A C G T<br />

<strong>last</strong>[c] 7 2 8 0<br />

1: G C A G A G A G<br />

#<br />

G C A T C G C A G A G A G T A T A C A G T A C G<br />

shift[8] = 1, 8-<strong>last</strong>[A] = 1, also nächster Versuch bei j = 1<br />

2: G C A G A G A G<br />

# | |<br />

G C A T C G C A G A G A G T A T A C A G T A C G<br />

shift[6] = 4, i-<strong>last</strong>[C] = 4, also nächster Versuch bei j = 5<br />

3: G C A G A G A G<br />

| | | | | | | |<br />

G C A T C G C A G A G A G T A T A C A G T A C G<br />

shift[0] = 7, also nächster Versuch bei j = 12<br />

4: G C A G A G A G<br />

# | |<br />

G C A T C G C A G A G A G T A T A C A G T A C G<br />

shift[6] = 4, i-<strong>last</strong>[C] = 4, also nächster Versuch bei j = 16<br />

5: G C A G A G A G<br />

# |<br />

G C A T C G C A G A G A G T A T A C A G T A C G<br />

shift[7] = 7, i-<strong>last</strong>[C] = 5, also nächster Versuch bei j = 23

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!