String Matching1

S-ar putea să vă placă și

Sunteți pe pagina 1din 36

Proiectarea algoritmilor: Cautare peste siruri

Dorel Lucanu
Faculty of Computer Science
Alexandru Ioan Cuza University, Iasi, Romania
dlucanu@info.uaic.ro
PA 2013/2014
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 1 / 36
Outline
1
Introducere
2
Algoritmul Rabin-Karp
3
Algoritmul Boyer-Moore
4
Algoritmul Knuth-Morris-Pratt
5
Algoritmul Boyer-Moore revizuit
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 2 / 36
Introducere
Plan
1
Introducere
2
Algoritmul Rabin-Karp
3
Algoritmul Boyer-Moore
4
Algoritmul Knuth-Morris-Pratt
5
Algoritmul Boyer-Moore revizuit
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 3 / 36
Introducere
Problema
Input Doua siruri s = s
0
s
n1
, numit subiect sau text, si
p = p
0
p
m1
, numit pattern.
Output Prima aparit ie a lui a patternului p n textul s, daca exista.
Varianta: gasirea tuturor aparit iilor.
Algoritmul de cautare secvent iala naiva are complexitatea O(n m).
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 4 / 36
Introducere
Put in istoric
Algoritmii care rezolva problema de cautarii peste siruri au o istorie interesanta.

In 1970, S.A. Cook a demonstrat un rezultat teoretic despre un anumit tip


abstract de masina, unde se presupunea existent a unui algoritm de cautare peste
siruri ce necesita un timp proport ional cu n + m n cazul cel mai nefavorabil. D.E.
Knuth si V.R. Pratt au utilizat construct ia laborioasa din teorema lui Cook si au
elaborat un algoritm care, mai apoi, a fost ranat ntr-un algoritm practic si
simplu. J.H. Morris a descoperit acelasi algoritm n timpul implementarii unui
editor de texte. Este unul dintre numeroasele exemple cand un rezultat pur
teoretic poate conduce la rezultate cu aplicabilitate imediata. Algoritmul dat de
Knuth, Morris si Pratt a fost publicat de abia n 1976.

Intre timp, R.S. Boyer si
J.S. Moore (si indepedent W. Gosper) au descoperit un algoritm care este mult
mai rapid n multe situat ii.

In 1980, R.M. Karp si M.O. Rabin au proiectat un
algoritm cu o descriere foarte simpla si care poate extins la texte si
pattern-uri bidimensionale, deci foarte util la procesarea imaginilor grace.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 5 / 36
Algoritmul Rabin-Karp
Plan
1
Introducere
2
Algoritmul Rabin-Karp
3
Algoritmul Boyer-Moore
4
Algoritmul Knuth-Morris-Pratt
5
Algoritmul Boyer-Moore revizuit
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 6 / 36
Algoritmul Rabin-Karp
Descriere
Acest algoritm utilizeaza tehnica tabelelor de dispersie (hash). Un simbol este o
secvent a de m caractere. Sa ne imaginam ca toate simbolurile posibile sunt
memorate ntr-o tabela de dispersie foarte mare, astfel ncat nu exista coliziune.
A testa daca pattern-ul p coincide cu un subsir de lungime m din text este
echivalent cu a testa daca funct ia de dispersie h da aceeasi valoare pentru ambele
simboluri. Exista avantajul ca pentru pattern funct ia de dispersie este calculata
o singura data. Pentru ca algoritmul sa e ecient, funct ia de dispersie trebuie
denita n asa fel ncat, atunci cand se face o deplasare la dreapta n text, calculul
valorii funct iei pentru urmatorul simbol sa e cat mai simplu. Timpul necesar
efectuarii acestui calcul trebuie sa e cu mult mai mic decat cel necesar
compararii a doua siruri de lungime m.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 7 / 36
Algoritmul Rabin-Karp
Funct ia de dispersie (hash)
Un mod de a deni funct ia de dispersie este urmatorul: Se considera ecare sir de
m caractere ca ind reprezentarea unui numar ntreg n baza d, unde d este
numarul maxim de caractere. Numarul zecimal corespunzator sirului
s[i ..i + m 1] este:
x = s[i ]d
m1
+ s[i + 1]d
m2
+ + s[i + m 1]
Funct ia de dispersie h va denita prin h(s[i ..i +m1]) = x mod q, unde q este
un numar prim foarte mare. O deplasare la dreapta n text corespunde nlocuirii
lui x cu:
(x s[i ]d
m1
)d + s[i + m]

In formulele de mai sus s-a presupus caracterele 0, . . . , d 1. Pentru a interpreta


caracterele textului ca ind cifre, consideram o funct ie index care asociaza
ecarui caracter numarul sau de ordine n alfabet.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 8 / 36
Algoritmul Rabin-Karp
Algoritmul Rabin-Karp
RK(s, n, p, m,) {
dlam1 = 1; /* calculeaza d la puterea m-1 */
for (i = 1; i<m; i = i+1)
dlam1 = (d*dlam1) % q;
hp = 0; /* h(p) */
for (i = 0; i< m; i = i+1)
hp = (hp*d+index(p[i])) % q;
hs = 0 /* h(s[1..m] */
for (i = 0 to i< m; i = i+1)
hs = (hs*d+index(s[i])) % q;
i=0; /* cautarea */
while (i <= n-m) {
if (hp == hs && eq(s[i..i+m-1], p)) return i
else {
hs = ((hs+d*q-index(s[i])*dlam1) % q *d + index(s[i+m])) % q;
i = i+1;
}
}
return -1;
}
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 9 / 36
Algoritmul Rabin-Karp
Algoritmul Rabin-Karp: implementare C
#define REHASH(a, b, h) ((((h)-(a)*d) << 1) (b))
int RK(char *p, int m, char *s, int n) {
long d, hs, hp, i, j;
/* Preprocesare */
for (d = i = 1; i < m; ++i)
d = (d << 1);
for (hp = hs = i = 0; i < m; ++i) {
hp = ((hp << 1) + p[i]);
hs = ((hs << 1) + s[i]);
}
/* Cautare */
i = 0;
while (i <= n-m) {
if (hp == hs && memcmp(p, s + i, m) == 0)
return i;
hs = REHASH(s[i], s[i + m], hs);
++i;
}
return -1;
}
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 10 / 36
Algoritmul Rabin-Karp
Analiza
Adunarea cu d q la recalculul lui hs se face pentru a siguri ca se obt ine
un numar pozitiv. Alegerea d = 32 s-a facut pentru ca operat ia de
nmult ire sa se efectueze foarte simplu (ntregii din Longint sunt
reprezentat i pe 32 bit i). Merita notat faptul ca datorita eventualelor
coliziuni, testul nal mai trebuie dublat de vericarea p = s[i ..i + m 1].
Desi teoretic, n cazul cel mai nefavorabil, algoritmul RK are o complexitate
timp proport ionala cu n m, n practica s-a dovedit a executa aproximativ
n + m pasi.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 11 / 36
Algoritmul Boyer-Moore
Plan
1
Introducere
2
Algoritmul Rabin-Karp
3
Algoritmul Boyer-Moore
4
Algoritmul Knuth-Morris-Pratt
5
Algoritmul Boyer-Moore revizuit
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 12 / 36
Algoritmul Boyer-Moore
Exemplu
bm-ex.pptx
Prima data se compara R (ultimul caracter din pattern) cu S (al treilea caracter
din text). Deoarece S nu apare n pattern, se deplaseaza pattern-ul cu trei
pozit ii (lungimea sa) la dreapta. Apoi se compara R cu caracterul spat iu. Nici
caracterul spat iu nu apare n pattern asa ca acesta se deplaseaza din nou la
dreapta cu trei pozit ii. Procesul continua pana cand R este comparat cu I (al
21-lea caracter din text). Deoarece I apare n pattern pe prima pozit ie se
deplaseaza pattern-ul la dreapta cu doua pozit ii. Apoi se compara R cu R, deci
exista potrivire. Se continua comparat ia cu penultimul caracter din pattern (de
fapt al doilea) si precedentul din text (al 22-lea). Se obt ine din nou potrivire si se
compara urmatoarele doua caractere de la stanga (primul din pattern si al
21-lea din text). Deoarece exista potrivire si pattern-ul a fost parcurs complet,
rezulta ca s-a determinat prima aparit ie a pattern-ului n text.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 13 / 36
Algoritmul Boyer-Moore
Regula caracterului rau
Engleza: bad character shift rule
Evita repetarea comparat iilor fara succes n cazul caracterelor care nu apar
n pattern sau ntr-un sux (maximal) al acestuia.
salt[C] =

m pozit ia ultimei aparit ii , daca C apare n pattern


a lui C n pattern
m , altfel
(alternativ, salt(C) = max({0} {i < m | p[i ] = C}))
bm-bad-character-shift-rule.pptx
Daca p[j ] = s[i ] = C,
1
daca aparit ia cea mai din dreapta a lui C n p este k < j , p[k] si s[i ] sunt
aliniate
2
daca aparit ia cea mai din dreapta a lui C n p este k > j , p este translatat la
dreapta cu o pozit ie
3
daca C nu apare n p, patternul p este aliniat cu s[i + 1..i + m] (saltul = j )
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 14 / 36
Algoritmul Boyer-Moore
Algoritmul Boyer-Moore (varianta 1)
BM(s, n, p, m, salt) {
i = m-1; j = m-1;
repeat
if (s[i] = p[j]) {
i = i-1;
j = j-1;
}
else if (m-j) > salt[s[i]] i = i+m-j;
else i = i+salt[s[i]];
j = m-1;
until (j<0 or i>n-1);
if (j<0) return i+1;
else return -1;
}
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 15 / 36
Algoritmul Boyer-Moore
Analiza
Pentru cazul cel mai nefavorabil are complexitatea O(m n).

In schimb are o comprtare buna n medie.


Vom vedea o alta versiune mai tarziu care este liniara.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 16 / 36
Algoritmul Knuth-Morris-Pratt
Plan
1
Introducere
2
Algoritmul Rabin-Karp
3
Algoritmul Boyer-Moore
4
Algoritmul Knuth-Morris-Pratt
5
Algoritmul Boyer-Moore revizuit
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 17 / 36
Algoritmul Knuth-Morris-Pratt
Descriere
Ideea algoritmului este urmatoarea: Atunci cand s-a ntalnit o nepotrivire, i.e.
caracterul curent p
j
din pattern este diferit de caracterul curent s
i
din text,
caracterele s
i 1
, . . . , s
i j +1
din text sunt cunoscute deoarece ele exista n
pattern. Pozit ia de start pentru urmatoarea comparat ie dintre pattern si text
poate determinata exploatand aceasta informat ie. Ca urmare, ntoarcerile n
text sunt eliminate. Astfel ca algoritmul va consta din doua etape:
1
Se proceseaza mai ntai pattern-ul n O(m) si se creeaza o structura de
date.
2
Folosind structura de date creata la prima etapa, se proceseaza textul fara a
mai executa ntoarceri.
kmp-ideea.pptx
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 18 / 36
Algoritmul Knuth-Morris-Pratt
Funct ia esec - descriere
f [j ] = k daca si numai daca p
0
p
k1
este de fapt cel mai lung prex al
lui p care se potriveste n p la pozit ia de sfarsit j 1. Funct ia f poate
denita recursiv:
Daca j = 0 atunci f [0] = 1 (putem presupune ca p
0
p
1
desemneaza sirul vid);
Presupunem j > 0. Fie k = f [j 1] (care este denita). Rezulta ca
p
0
p
k1
este cel mai lung prex al lui p
0
p
j
care se potriveste n
p la pozit ia de sfarsit j 2. Daca p
k
= p
j 1
atunci f [j ] = k + 1.
Altfel, se cauta cel mai lung prex al lui p
0
p
k
care se potriveste n
p la pozit ia de sfarsit j 2. Adica se face k = f [k] si se repeta
rat ionamentul de mai sus.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 19 / 36
Algoritmul Knuth-Morris-Pratt
Funct ia esec - algoritm
determinaF (p, m, f) {
f[0] = -1;
for (j = 1; j< m; j = j+1) {
k = f[j-1];
while ((k != -1) && (p[j-1] != p[k]))
k = f[k];
f[j] = k+1;
}
}
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 20 / 36
Algoritmul Knuth-Morris-Pratt
Exemplu
p = abaabaaabc
5 0 1 2 3 4
6 7 8
a
b
a a
b a a a b c
9

-1
j 0 1 2 3 4 5 6 7 8 9
p[j]
a b a a b a a a b c
f[j] -1 0 0 1 1 2 3 1 1 2
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 21 / 36
Algoritmul Knuth-Morris-Pratt
Analiza
Invariantul instruct iunii for: la sfarsitul execut iei ecarei bucle for, f [j ]
este lungimea cel mai lung prex al lui p care se potriveste n p la pozit ia
de sfarsit j 1.
Timpul n cazul cel mai nefavorabil este O(m). Daca aplatizam cele doua
while-uri ntr-unul singur, la ecare pas se mareste cu cel put in o unitate j
sau j k. Rezulta ca vor maxim 2m iterat ii.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 22 / 36
Algoritmul Knuth-Morris-Pratt
Algoritmul KMP
KMP(s, n, p, m, f) {
i = 0;
j = 0;
while (i < n) {
while (j != -1) && (p[j] != s[i])
j = f[j];
if (j = m-1)
return i-m+1; /* gasit p in s */
else {
i = i+1;
j = j+1;
}
}
return -1; /* p nu apare in s */
}
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 23 / 36
Algoritmul Knuth-Morris-Pratt
Analiza
Invariantul primei instruct iuni while: la sfarsitul execut iei ecarei bucle
whilw, p[0..j 1] este cel mai lung prex al lui p care se potriveste n s la
pozit ia de sfarsit i 1.
Rezulta ca dupa terminarea instruct iunii while interioare, p[0..j ] este cel
mai lung prex al lui p care se potriveste n s la pozit ia de sfarsit i .
Timpul n cazul cel mai nefavorabil este O(n + m). Valoarea lui j nu
poate descreste n total de mai multe ori de cate ori este incrementat n
bucla exterioara while.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 24 / 36
Algoritmul Boyer-Moore revizuit
Plan
1
Introducere
2
Algoritmul Rabin-Karp
3
Algoritmul Boyer-Moore
4
Algoritmul Knuth-Morris-Pratt
5
Algoritmul Boyer-Moore revizuit
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 25 / 36
Algoritmul Boyer-Moore revizuit
Motivat ie
Regula caracterului rau nu este ecienta daca alfabetul este mic.

In astfel de cazuri se poate castiga n ecient a daca se considera suxele


potrivite deja.
Asta este realizata de regula suxului bun.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 26 / 36
Algoritmul Boyer-Moore revizuit
Regula suxului bun: ilustrare caz 1
0 1 2 3 4 5 6 7 8 9 1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
a c c a c b b
! # $ $ # ! $ # $
a b b a b b c
$ # $
a a b a b b c
$ # $
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
a c c a c b b
! # $ $ # ! $ # $
a b b a b b c
$ # $
a a b a b b c
$ # $
0 1 2 3 4 5 6 7 8 9
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 27 / 36
Algoritmul Boyer-Moore revizuit
Regula suxului bun: cazul 1 formal
Cazul 1:
daca p[j 1] nu se potriveste si p include o copie a lui p[j ..m 1]
precedata de un caracter = p[j 1], se face salt la cea mai apropiata copie
din stanga cu aceasta proprietate.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 28 / 36
Algoritmul Boyer-Moore revizuit
Regula suxului bun: ilustrare caz 2
0 1 2 3 4 5 6 7 8 9 1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
a b c a c b b
! # $ $ # ! $ # $
a b b a b b c
$ # $
a b b a b c b
! # $
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
a b c a c b b
! # $ $ # ! $ # $
a b b a b b c
$ # $
a b b a b c b
! # $
0 1 2 3 4 5 6 7 8 9
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 29 / 36
Algoritmul Boyer-Moore revizuit
Regula suxului bun: cazul 2 formal
Cazul 2:
daca nu se aplica regula din cazul 1, se face saltul cel mai mic astfel ncat
un sux al lui s[0..i ] se potriveste cu un prex al lui p
daca cel mai lung prex al lui s[0..i ] care se potriveste peste un prex al lui
p este sirul vid, atunci se face un salt cu m pozit ii
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 30 / 36
Algoritmul Boyer-Moore revizuit
goodSu (j ) - denit ie
goodSu (j ) = pozit ia de sfarsit a unei aparit ii a lui p[j ..m 1] care nu
este precedata de p[j 1]
daca nu exista o astfel de copie, goodSu (j ) = 0
0 goodSu (j ) < m 1; daca goodSu (j ) > 0 atunci el reprezinta o
copie a unui sux bun care permite un salt de m goodSu (j ) pozit ii
deoarece p[m..m 1] este sirul vid, goodSu (m) = cea mai din dreapta
pozit ie k cu p[k] = p[m 1] (1 daca toate caracterele sunt egale).
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 31 / 36
Algoritmul Boyer-Moore revizuit
goodSu (j ) - calcul
lcs(j , p) = lungimea celui mai lung sux comun lui p[0..j ] si p.
Lema
Valorile lcs(j , p) pot calculate n timpul O(m).
Exercit iu Sa se demonstreze lema. (se utilizeaza algoritmul Z).
Teorema
Daca goodSu (j ) > 0, atunci goodSu (j ) este cel mai mare k < m 1
cu lcs(k, p) = m j (= |p[j ..m 1]).
Rezulta ca valorile goodSu (j ) pot calculate n timpul O(m).
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 32 / 36
Algoritmul Boyer-Moore revizuit
Preprocesarea n cazul 2
lp(j ) = lungimea celui mai lung prex al lui p care este sux al lui
p[j ..m 1].
Lema
lp(j ) = max{k | 0 k |p[j ..m 1] lcs(k, p) = k.
Exercit iu Sa se demonstreze lema.
Rezulta ca valorile lp(j ) pot calculate n timpul O(m).
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 33 / 36
Algoritmul Boyer-Moore revizuit
Regula suxului bun
Presupunem ca p[j 1] nu se potriveste (dupa ce s-au potrivit p[j ..m1].
1
daca goodSu (j ) > 0, face un salt egal cu m goodSu (j ) (cazul 1)
2
daca goodSu (j ) = 0, face un salt egal cu m lp(j ) (cazul 1)
Daca p[m 1] nu se potriveste, atunci j = m si saltul este corect.
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 34 / 36
Algoritmul Boyer-Moore revizuit
Algoritmul Boyer-Moore (versiunea 2)
BM(s, n, p, m, goodSuff, lp) {
k = m-1;
while (k < n) {
i = k; j = m-1;
while (j > 0 && p[j] == s[i]) {
i = i-1;
j = j-1;
}
if (j < 0) return i+1;
// nepotrivire pe pozitia p[j]
mareste k cu maximul dintre salturile date de
regula caracterului rau si regula sufixului bun
}
}
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 35 / 36
Algoritmul Boyer-Moore revizuit
Analiza
Teorema ([?])
Algoritmul BM executa totdeauna cel mult m + n comparat ii de caractere si
aproximativ
n
m
salturi cand alfabetul nu este mic si pattern-ul nu este
prea lung.
Observat ie: Daca alfabetul are numai doua caractere (cazul sirurilor
binare), atunci performant ele algoritmului BM nu sunt cu mult mai bune
decat cele ale cautarii naive.

In acest caz se recomanda mpart irea sirurilor
n grupe cu un numar xat de bit i. Fiecare grupa reprezinta un caracter.
Daca dimensiunea unei grupe este k atunci vor exista 2
k
caractere, i.e.
dintr-un alfabet mic obt inem unul cu multe caractere. Totusi, k va trebui
ales sucient de mic pentru ca dimensiunea tabelei de salturi sa nu e prea
mare. sfobs
D. Lucanu (FII - UAIC) Cautare peste siruri PA 2013/2014 36 / 36

S-ar putea să vă placă și