03.07.2013 Views

Exact string matching - caagt

Exact string matching - caagt

Exact string matching - caagt

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!