Exact string matching - caagt
Exact string matching - caagt
Exact string matching - caagt
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Exact</strong> <strong>string</strong> <strong>matching</strong><br />
brute-kracht-algoritme<br />
algoritme van Rabin-Karp<br />
algoritme van Boyer-Moore-Horspool<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.1/32
Brute-kracht-algoritme<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.2/32
Brute-kracht-algoritme<br />
Input: patroon P , lengte m; tekst T , lengte n<br />
Output: kleinste i zo dat T [i..i + m − 1] = P , of<br />
−1 wanneer P niet optreedt in T<br />
1: i ← 0<br />
2: while i + m ≤ n do<br />
3: j ← 0<br />
4: while T [i + j] = P [j] do<br />
5: j ← j + 1<br />
6: if j ≥ m then<br />
7: return i<br />
8: i ← i + 1<br />
9: return −1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.3/32
Voorbeeld<br />
Zoeken P = 001 in T = 010001<br />
T 0 1 0 0 0 1<br />
P 0 0 1<br />
0 0 1<br />
0 0 1<br />
0 0 1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.4/32
Complexiteit<br />
Uitvoeringstijd: Θ(m(n − m))<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.5/32
Complexiteit<br />
Uitvoeringstijd: Θ(m(n − m))<br />
slechtste geval: P komt niet voor in T<br />
uitvoeringstijd Θ(m(n − m))<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.5/32
Complexiteit<br />
Uitvoeringstijd: Θ(m(n − m))<br />
slechtste geval: P komt niet voor in T<br />
uitvoeringstijd Θ(m(n − m))<br />
beste geval: P aan begin van T<br />
uitvoeringstijd Θ(m)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.5/32
Complexiteit<br />
Uitvoeringstijd: Θ(m(n − m))<br />
slechtste geval: P komt niet voor in T<br />
uitvoeringstijd Θ(m(n − m))<br />
beste geval: P aan begin van T<br />
uitvoeringstijd Θ(m)<br />
In de praktijk<br />
beter dan Θ(m(n − m))<br />
want binnenste lus herkent<br />
niet-overeenstemmend patroon snel<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.5/32
Beschouwde algoritmen<br />
Uiteindelijke bedoeling<br />
algoritme met uitvoeringstijd Θ(n + m)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.6/32
Beschouwde algoritmen<br />
Uiteindelijke bedoeling<br />
algoritme met uitvoeringstijd Θ(n + m)<br />
Gemiddeld Θ(n + m)<br />
algoritme van Rabin-Karp<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.6/32
Beschouwde algoritmen<br />
Uiteindelijke bedoeling<br />
algoritme met uitvoeringstijd Θ(n + m)<br />
Gemiddeld Θ(n + m)<br />
algoritme van Rabin-Karp<br />
Slechtste geval Θ(n + m)<br />
algoritme van Knuth-Morris-Pratt<br />
algoritme van Boyer-Moore<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.6/32
Beschouwde algoritmen<br />
Uiteindelijke bedoeling<br />
algoritme met uitvoeringstijd Θ(n + m)<br />
Gemiddeld Θ(n + m)<br />
algoritme van Rabin-Karp<br />
Slechtste geval Θ(n + m)<br />
algoritme van Knuth-Morris-Pratt<br />
algoritme van Boyer-Moore<br />
Slechtste geval Θ(nm) maar toch snel<br />
algoritme van Boyer-Moore-Horspool<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.6/32
Algoritme van Rabin-Karp<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.7/32
Fingerprinting<br />
Merk op<br />
expliciete controle P kost Θ(m)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.8/32
Fingerprinting<br />
Merk op<br />
expliciete controle P kost Θ(m)<br />
Basisidee<br />
vóór expliciete controle op positie i<br />
eerst eenvoudige test die i evt. elimineert<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.8/32
Fingerprinting<br />
Merk op<br />
expliciete controle P kost Θ(m)<br />
Basisidee<br />
vóór expliciete controle op positie i<br />
eerst eenvoudige test die i evt. elimineert<br />
Fingerprinting<br />
beschouwen niet volledige patroon<br />
maar slechts een aspect ervan (vingerafdruk)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.8/32
Ideaal<br />
test in Θ(1)<br />
elimineert alle behalve 1/m-de van posities<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.9/32
Ideaal<br />
test in Θ(1)<br />
elimineert alle behalve 1/m-de van posities<br />
Immers<br />
totale kost van testen = Θ(n − m)<br />
totale kost expliciete controles = Θ(n − m)<br />
controle op (n − m + 1)/m posities<br />
elk van kost Θ(m)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.9/32
Voorbeeld<br />
Zoek P = 0011 in T = 0001001000<br />
T 0 0 0 1 0 0 1 0 0 0<br />
P 0 0 1 1<br />
0 0 1 1<br />
0 0 1 1<br />
0 0 1 1<br />
0 0 1 1<br />
0 0 1 1<br />
0 0 1 1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.10/32
Pariteitscontrole<br />
Voorbeeld<br />
zoeken P = 0011 in T = 0001001000<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.11/32
Pariteitscontrole<br />
Voorbeeld<br />
zoeken P = 0011 in T = 0001001000<br />
P heeft pariteit 2<br />
elke T [i..i + 3] heeft pariteit 1, behalve i = 3<br />
6 van 7 posities te elimineren op basis van<br />
pariteit<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.11/32
Pariteitscontrole<br />
Voorbeeld<br />
zoeken P = 0011 in T = 0001001000<br />
P heeft pariteit 2<br />
elke T [i..i + 3] heeft pariteit 1, behalve i = 3<br />
6 van 7 posities te elimineren op basis van<br />
pariteit<br />
Aanpassen algoritme<br />
voor elke positie, eerst pariteit bepalen<br />
enkel als pariteit OK, ook volledige<br />
patrooncontrole<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.11/32
Implementatie pariteitscontrole<br />
Merk op<br />
bepalen van pariteit van m bits kost Θ(m)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.12/32
Implementatie pariteitscontrole<br />
Merk op<br />
bepalen van pariteit van m bits kost Θ(m)<br />
Efficiënte implementatie<br />
vooraf: bereken pariteit P en T [0..m − 1]<br />
kost Θ(m)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.12/32
Implementatie pariteitscontrole<br />
Merk op<br />
bepalen van pariteit van m bits kost Θ(m)<br />
Efficiënte implementatie<br />
vooraf: bereken pariteit P en T [0..m − 1]<br />
kost Θ(m)<br />
in elke stap i<br />
stel xi = pariteit van T [i..i + m − 1]<br />
xi = xi−1 + T [i − 1] + T [i + m − 1] mod 2<br />
dus: kost Θ(1) per stap<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.12/32
Performantie pariteitscontrole<br />
Performantie<br />
gemiddeld verwachten dat pariteitscontrole<br />
helft van posities elimineert<br />
totale tijd nog steeds Θ(n(n − m))<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.13/32
Performantie pariteitscontrole<br />
Performantie<br />
gemiddeld verwachten dat pariteitscontrole<br />
helft van posities elimineert<br />
totale tijd nog steeds Θ(n(n − m))<br />
Probleem<br />
teveel waarden delen dezelfde vingerafdruk<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.13/32
Performantie pariteitscontrole<br />
Performantie<br />
gemiddeld verwachten dat pariteitscontrole<br />
helft van posities elimineert<br />
totale tijd nog steeds Θ(n(n − m))<br />
Probleem<br />
teveel waarden delen dezelfde vingerafdruk<br />
Gewenst<br />
versnellingsfactor q bekomen<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.13/32
Uitbreiding<br />
Vereisten vingerafdrukfunctie<br />
(a) bit<strong>string</strong>s van lengte m afbeelden op q =<br />
waarden<br />
(b) gelijkmatig verdelen over q vingerafdrukken<br />
(c) gemakkelijk “in sequentie” berekenbaar<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.14/32
Uitbreiding<br />
Vereisten vingerafdrukfunctie<br />
(a) bit<strong>string</strong>s van lengte m afbeelden op q =<br />
waarden<br />
(b) gelijkmatig verdelen over q vingerafdrukken<br />
(c) gemakkelijk “in sequentie” berekenbaar<br />
Merk op<br />
hashfunctie voldoet aan (a) en (b)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.14/32
Uitbreiding<br />
Vereisten vingerafdrukfunctie<br />
(a) bit<strong>string</strong>s van lengte m afbeelden op q =<br />
waarden<br />
(b) gelijkmatig verdelen over q vingerafdrukken<br />
(c) gemakkelijk “in sequentie” berekenbaar<br />
Merk op<br />
hashfunctie voldoet aan (a) en (b)<br />
Eenvoudige hashfunctie: som van de bits<br />
voldoet niet aan (b)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.14/32
Hashfunctie van Rabin-Karp<br />
Hashfunctie<br />
beschouw bit<strong>string</strong> als natuurlijk getal, neem<br />
rest bij deling door q<br />
h(s0 . . . sm−1) = m−1<br />
j=0 sj2 m−1−j mod q<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.15/32
Hashfunctie van Rabin-Karp<br />
Hashfunctie<br />
beschouw bit<strong>string</strong> als natuurlijk getal, neem<br />
rest bij deling door q<br />
h(s0 . . . sm−1) = m−1<br />
j=0 sj2 m−1−j mod q<br />
Goede hashfunctie?<br />
voldoet aan (a)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.15/32
Hashfunctie van Rabin-Karp<br />
Hashfunctie<br />
beschouw bit<strong>string</strong> als natuurlijk getal, neem<br />
rest bij deling door q<br />
h(s0 . . . sm−1) = m−1<br />
j=0 sj2 m−1−j mod q<br />
Goede hashfunctie?<br />
voldoet aan (a)<br />
voldoet aan (b) voor priemgetal q > m<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.15/32
Hashfunctie van Rabin-Karp<br />
Hashfunctie<br />
beschouw bit<strong>string</strong> als natuurlijk getal, neem<br />
rest bij deling door q<br />
h(s0 . . . sm−1) = m−1<br />
j=0 sj2 m−1−j mod q<br />
Goede hashfunctie?<br />
voldoet aan (a)<br />
voldoet aan (b) voor priemgetal q > m<br />
voldoet aan (c) want<br />
h(s1 . . . sm) = sm + 2(h(s0 . . . sm−1) − 2 m−1 s0) mod q<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.15/32
Algoritme van Rabin-Karp<br />
1: q ← een priemgetal > m<br />
2: r ← 2 m−1 mod q<br />
3: fp ← m−1<br />
j=0 P [j]2m−1−j mod q<br />
4: ft[0] ← m−1<br />
j=0 T [j]2m−1−j mod q<br />
5: i ← 0<br />
6: while i + m ≤ n do<br />
7: if ft[i] = fp then<br />
8: if T [i..i + m − 1] = P then<br />
9: return i<br />
10: ft[i + 1] ← 2(ft[i] − rT [i]) + T [i + m] mod q<br />
11: i ← i + 1<br />
12: return −1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.16/32
Algoritme van<br />
Boyer-Moore-Horspool<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.17/32
Algoritme van Boyer-Moore<br />
Idee van Boyer-Moore<br />
P met T vergelijken van rechts naar links<br />
verschuiven P van links naar rechts<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.18/32
Algoritme van Boyer-Moore<br />
Idee van Boyer-Moore<br />
P met T vergelijken van rechts naar links<br />
verschuiven P van links naar rechts<br />
Voorbeeld<br />
zoek P = roos in T = klaproos<br />
klaproos<br />
...s<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.18/32
Algoritme van Boyer-Moore<br />
Idee van Boyer-Moore<br />
P met T vergelijken van rechts naar links<br />
verschuiven P van links naar rechts<br />
Voorbeeld<br />
zoek P = roos in T = klaproos<br />
klaproos<br />
...s<br />
verschuiven een positie naar rechts<br />
klaproos<br />
...s<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.18/32
Algoritme van Boyer-Moore<br />
Idee van Boyer-Moore<br />
P met T vergelijken van rechts naar links<br />
verschuiven P van links naar rechts<br />
Voorbeeld<br />
zoek P = roos in T = klaproos<br />
klaproos<br />
...s<br />
verschuiven een positie naar rechts<br />
klaproos<br />
...s<br />
enz., tot match gevondenCursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.18/32
Eenvoudig B-M-algoritme<br />
Input: patroon P , lengte m; tekst T , lengte n<br />
Output: kleinste i zo dat T [i..i + m − 1] = P , of<br />
−1 wanneer P niet optreedt in T<br />
1: i ← 0<br />
2: while i + m ≤ n do<br />
3: j ← m − 1<br />
4: while T [i + j] = P [j] do<br />
5: j ← j − 1<br />
6: if j < 0 then<br />
7: return i<br />
8: i ← i + 1<br />
9: return −1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.19/32
Complexiteit<br />
Uitvoeringstijd<br />
slechtste geval Θ(nm)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.20/32
Complexiteit<br />
Uitvoeringstijd<br />
slechtste geval Θ(nm)<br />
Uitbreiden met heuristieken<br />
occurrence-heuristiek<br />
match-heuristiek<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.20/32
Complexiteit<br />
Uitvoeringstijd<br />
slechtste geval Θ(nm)<br />
Uitbreiden met heuristieken<br />
Idee<br />
occurrence-heuristiek<br />
match-heuristiek<br />
bij mismatch P over > 1 positie verschuiven<br />
→ significant versnellen van algoritme<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.20/32
Voorbeeld 1<br />
Zoek P = roos in T = klaproos<br />
mismatch bij eerste vergelijking<br />
klaproos<br />
...s<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.21/32
Voorbeeld 1<br />
Zoek P = roos in T = klaproos<br />
mismatch bij eerste vergelijking<br />
klaproos<br />
...s<br />
geen p in P , dus over 4 posities verschuiven<br />
klaproos<br />
....<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.21/32
Voorbeeld 1<br />
Zoek P = roos in T = klaproos<br />
mismatch bij eerste vergelijking<br />
klaproos<br />
...s<br />
geen p in P , dus over 4 posities verschuiven<br />
klaproos<br />
....<br />
match wordt gevonden<br />
klaproos<br />
roos<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.21/32
Voorbeeld 2<br />
Zoek P = roes in T = marsroes<br />
mismatch bij tweede vergelijking<br />
marsroes<br />
..es<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.22/32
Voorbeeld 2<br />
Zoek P = roes in T = marsroes<br />
mismatch bij tweede vergelijking<br />
marsroes<br />
..es<br />
r uit T komt voor in P , aligneer<br />
marsroes<br />
r...<br />
...s<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.22/32
Voorbeeld 2<br />
Zoek P = roes in T = marsroes<br />
mismatch bij tweede vergelijking<br />
marsroes<br />
..es<br />
r uit T komt voor in P , aligneer<br />
marsroes<br />
r...<br />
...s<br />
mismatch bij o uit T , aligneer<br />
marsroes<br />
.o..<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.22/32
Voorbeeld 2<br />
Zoek P = roes in T = marsroes<br />
mismatch bij tweede vergelijking<br />
marsroes<br />
..es<br />
r uit T komt voor in P , aligneer<br />
marsroes<br />
r...<br />
...s<br />
mismatch bij o uit T , aligneer<br />
marsroes<br />
.o..<br />
roes Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.22/32
Occurrence-heuristiek<br />
Algemene formulering<br />
vergelijk P met T van rechts naar links<br />
wanneer mismatch bij α uit T<br />
verschuif P zo dat meest rechtse voorkomen<br />
van α in P gealigneerd is met α van<br />
mismatch in T<br />
als P geen α bevat, verschuif P tot voorbij α<br />
in T<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.23/32
Probleem<br />
Mogelijk probleem<br />
P kan naar links schuiven i.p.v. naar rechts<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.24/32
Probleem<br />
Mogelijk probleem<br />
P kan naar links schuiven i.p.v. naar rechts<br />
Voorbeeld: zoek rage in regeneratie<br />
mismatch bij derde vergelijking<br />
regeneratie<br />
.age<br />
zou leiden tot verschuiving<br />
regeneratie<br />
...e<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.24/32
Probleem<br />
Mogelijk probleem<br />
P kan naar links schuiven i.p.v. naar rechts<br />
Voorbeeld: zoek rage in regeneratie<br />
mismatch bij derde vergelijking<br />
regeneratie<br />
.age<br />
zou leiden tot verschuiving<br />
regeneratie<br />
...e<br />
Oplossing: P één positie naar rechts schuiven<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.24/32
Match-heuristiek<br />
Idee<br />
cfr. Knuth-Morris-Pratt (zie later)<br />
wanneer match-proces faalt, informatie over<br />
geziene stuk T gebruiken om P te<br />
verschuiven<br />
vergelijken van links naar rechts →<br />
verschuivingstabel voor achterstevoren P<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.25/32
Algoritme van Boyer-Moore<br />
Algoritme<br />
eenvoudig B-M-algoritme<br />
met bijkomend grootste verschuiving van<br />
occurrence-heuristiek<br />
match-heuristiek<br />
garandeert uitvoeringstijd Θ(n + m)<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.26/32
Algoritme van Boyer-Moore<br />
Algoritme<br />
eenvoudig B-M-algoritme<br />
met bijkomend grootste verschuiving van<br />
occurrence-heuristiek<br />
match-heuristiek<br />
garandeert uitvoeringstijd Θ(n + m)<br />
In de praktijk<br />
complexe implementatie, match-heuristiek<br />
variante van Horspool<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.26/32
Algoritme van B-M-Horspool<br />
Algoritme<br />
eenvoudig BM-algoritme, met bijkomend<br />
variant van occurrence-heuristiek<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.27/32
Algoritme van B-M-Horspool<br />
Algoritme<br />
eenvoudig BM-algoritme, met bijkomend<br />
variant van occurrence-heuristiek<br />
Complexiteit<br />
slechtste geval Θ(nm)<br />
in de praktijk zeer snel<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.27/32
Algoritme van B-M-Horspool<br />
Algoritme<br />
eenvoudig BM-algoritme, met bijkomend<br />
variant van occurrence-heuristiek<br />
Complexiteit<br />
slechtste geval Θ(nm)<br />
in de praktijk zeer snel<br />
Algemene ideeën<br />
doel: vermijden P naar links te verschuiven<br />
idee Horspool: bepaal verschuiving uit laatste<br />
teken i.p.v. teken dat mismatch levert<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.27/32
Voorbeeld<br />
Zoek P = rage in T = regeneratie<br />
mismatch bij P [1] = a en T [1] = e<br />
regeneratie<br />
.age<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.28/32
Voorbeeld<br />
Zoek P = rage in T = regeneratie<br />
mismatch bij P [1] = a en T [1] = e<br />
regeneratie<br />
.age<br />
verschuif zodat T [3] gealigneerd met<br />
volgende e in P<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.28/32
Voorbeeld<br />
Zoek P = rage in T = regeneratie<br />
mismatch bij P [1] = a en T [1] = e<br />
regeneratie<br />
.age<br />
verschuif zodat T [3] gealigneerd met<br />
volgende e in P<br />
geen e meer in P<br />
dus P opschuiven tot voorbij T [3]<br />
regeneratie<br />
....<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.28/32
Implementatie<br />
voor elk karakter x uit alfabet<br />
bijhouden van meest rechtse positie van x in<br />
P links van P [m − 1]<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.29/32
Implementatie<br />
voor elk karakter x uit alfabet<br />
bijhouden van meest rechtse positie van x in<br />
P links van P [m − 1]<br />
Formeel<br />
als x behoort tot P [0..m − 2]:<br />
S[x] = m − 1 − max{i < m − 1 | P [i] = x}<br />
anders S[x] = m<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.29/32
Voorbeeld<br />
Patroon P = lege<br />
S[l] = 3, S[e] = 2, S[g] = 1<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.30/32
Voorbeeld<br />
Patroon P = lege<br />
S[l] = 3, S[e] = 2, S[g] = 1<br />
Zoeken P in tekst T = regeneratieleger<br />
mismatch van T [0] en P [0]<br />
regeneratieleger<br />
lege<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.30/32
Voorbeeld<br />
Patroon P = lege<br />
S[l] = 3, S[e] = 2, S[g] = 1<br />
Zoeken P in tekst T = regeneratieleger<br />
mismatch van T [0] en P [0]<br />
regeneratieleger<br />
lege<br />
verschuif over S[T [3]] = 2<br />
regeneratieleger<br />
.e..<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.30/32
Voorbeeld<br />
Patroon P = lege<br />
S[l] = 3, S[e] = 2, S[g] = 1<br />
Zoeken P in tekst T = regeneratieleger<br />
mismatch van T [0] en P [0]<br />
regeneratieleger<br />
lege<br />
verschuif over S[T [3]] = 2<br />
regeneratieleger<br />
.e..<br />
..ge<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.30/32
Vervolg voorbeeld<br />
r e g e n e r a t i e l e g e r<br />
l e g e<br />
l e g e<br />
l e g e<br />
l e g e<br />
l e g e<br />
Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.31/32
Algoritme van B-M-H<br />
1: for k from 0 to |Σ| − 1 do<br />
2: S[k] ← m<br />
3: for k from 0 to m − 2 do<br />
4: S[P [k]] ← m − 1 − k<br />
5: i ← 0<br />
6: while i + m ≤ n do<br />
7: j ← m − 1<br />
8: while T [i + j] = P [j] do<br />
9: j ← j − 1<br />
10: if j < 0 then<br />
11: return i<br />
12: i ← i + S[T [i + m − 1]]<br />
13: return −1 Cursus Algoritmen en Datastructuren III - Parallelle Algoritmen (2006–2007) – p.32/32