Algorithmus Boyer - Moore Bestimmung der last-Funktion
Algorithmus Boyer - Moore Bestimmung der last-Funktion
Algorithmus Boyer - Moore Bestimmung der last-Funktion
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