Sunteți pe pagina 1din 64

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)

C
autare peste siruri

PA 2013/2014

1 / 52

Outline

Introducere

Algoritmul Rabin-Karp

Algoritmul Boyer-Moore

Algoritmul Knuth-Morris-Pratt

Algoritmul Z

Algoritmul Boyer-Moore revizuit

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

2 / 52

Introducere

Plan

Introducere

Algoritmul Rabin-Karp

Algoritmul Boyer-Moore

Algoritmul Knuth-Morris-Pratt

Algoritmul Z

Algoritmul Boyer-Moore revizuit

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

3 / 52

Introducere

Problema

Input Doua siruri s = s0 sn1 , numit subiect sau text, si


p = p0 pm1 , numit pattern.
Output Prima aparitie a lui a patternului p n textul s, daca exista.
Varianta: gasirea tuturor aparitiilor.
Algoritmul de cautare secventiala naiva are complexitatea O(n m).

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

4 / 52

Introducere

Putin 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 existenta unui algoritm de cautare peste
siruri ce necesita un timp proportional cu n + m n cazul cel mai nefavorabil. D.E.
Knuth si V.R. Pratt au utilizat constructia laborioasa din teorema lui Cook si au
elaborat un algoritm care, mai apoi, a fost rafinat 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 situatii. In 1980, R.M. Karp si M.O. Rabin au proiectat un
algoritm cu o descriere foarte simpla si care poate fi extins la texte si
pattern-uri bidimensionale, deci foarte util la procesarea imaginilor grafice.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

5 / 52

Algoritmul Rabin-Karp

Plan

Introducere

Algoritmul Rabin-Karp

Algoritmul Boyer-Moore

Algoritmul Knuth-Morris-Pratt

Algoritmul Z

Algoritmul Boyer-Moore revizuit

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

6 / 52

Algoritmul Rabin-Karp

Descriere

Acest algoritm utilizeaza tehnica tabelelor de dispersie (hash). Un simbol este o


secventa 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 functia de dispersie h da aceeasi valoare pentru ambele
simboluri. Exista avantajul ca pentru pattern functia de dispersie este calculata
o singura data. Pentru ca algoritmul sa fie eficient, functia de dispersie trebuie
definita n asa fel ncat, atunci cand se face o deplasare la dreapta n text, calculul
valorii functiei pentru urmatorul simbol sa fie cat mai simplu. Timpul necesar
efectuarii acestui calcul trebuie sa fie cu mult mai mic decat cel necesar
compararii a doua siruri de lungime m.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

7 / 52

Algoritmul Rabin-Karp

Functia de dispersie (hash)


Un mod de a defini functia de dispersie este urmatorul: Se considera fiecare sir de
m caractere ca fiind 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]
Functia de dispersie h va fi definita 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 fiind cifre, consideram o functie index care asociaza
fiecarui caracter numarul sau de ordine n alfabet.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

8 / 52

Algoritmul Rabin-Karp

Tabela hash

Pentru a evita lucrul cu numere mari, operatiile se executa modulo un


numar natural q;
Ne putem imagina ca q este dimensiunea tabelei hash care
memoreaza simbolurile (= secventele de m caractere) din s.
Pentru o dispersie buna, q trebuie sa fie un numar prim mare.
Deoarece pot exista coliziuni, se utiliza o functie eq(p, s, j, m)
care compara caracter cu caracter; aceasta functie este apelata doar
cand exista egalitate a valorilor hash.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

9 / 52

Algoritmul Rabin-Karp

Algoritmul Rabin-Karp
rk(s, n, p, m) {
// preprocesare
for (j = 1; j < m; j++) dM = (d * dM) % q;
for (j = 0; j < m; j++) {
hp = (hp*d + p[j]) % q; // hash pentru pattern
hs = (hs*d + s[j]) % q; // hash pentru text
}
// cautare
if (hp == hs && eq(p, s, 0, m)) return 0;
for (i = m; i < n; i++) {
hs = (hs - s[i-m]) % q;
hs = (hs*d + s[i]) % q;
if (hs == hp && eq(p, s, i-m, m)) return i - m + 1;
}
return -1;
}
D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

10 / 52

Algoritmul Rabin-Karp

Analiza

Desi teoretic, n cazul cel mai nefavorabil, algoritmul RK are o complexitate


timp proportionala cu n m, n practica s-a dovedit a executa aproximativ
n + m pasi.
Timpul mediu se poate calcula luand q (dimensiunea tabelei) generat
aleatoriu (algoritm Las Vegas).

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

11 / 52

Algoritmul Rabin-Karp

Algoritmul Rabin-Karp: o posibila implementare C


#define REHASH(a, b, h) ((((h)-(a)*dM) << 1) (b))
int RK(char *p, int m, char *s, int n) {
long dM, hs, hp, i, j;
/* Preprocesare */
for (dM = i = 1; i < m; ++i) dM = (dM << 1); // d = 2
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;
}
sursa: http://www-igm.univ-mlv.fr/ lecroq/string/node5.html
D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

12 / 52

Algoritmul Rabin-Karp

Analiza impelementarii C

S-a presupus ca d = 2. Daca d = 2k , atunci se poate utiliza relatia


d m1 = (2k )m1 = (2m1 )k .
Daca long este reprezentat pe 64 biti, atunci dM este 0 pentru
m = 65. Deci trebuie sa avem m 65
k .
Nu mai este utilizat numarul prim q deoarece se utilizeaza aritmetica
modulara peste long.
O implementare Java cu q determinat aleatoriu (Robert Sedgewick and
Kevin Wayne) poate fi gasita la adresa
http://algs4.cs.princeton.edu/53substring/RabinKarp.java.html.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

13 / 52

Algoritmul Boyer-Moore

Plan

Introducere

Algoritmul Rabin-Karp

Algoritmul Boyer-Moore

Algoritmul Knuth-Morris-Pratt

Algoritmul Z

Algoritmul Boyer-Moore revizuit

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

14 / 52

Algoritmul Boyer-Moore

Exemplu
0
V

1
I

2 3
S U
6
=

4
L

6 7 8 9 10 11 12 13 14 15 16 17 18
U N E I
N O P T I
D E

19 20 21 22 23 24
I A R N A

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

15 / 52

Algoritmul Boyer-Moore

Exemplu
0
V

1
I

2
S

3
U

4
L

6 7 8 9 10 11 12 13 14 15 16 17 18
U N E I
N O P T I
D E

6=
I

19 20 21 22 23 24
I A R N A

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

15 / 52

Algoritmul Boyer-Moore

Exemplu
0
V

1
I

2
S

3
U

4
L

6 7 8 9 10 11 12 13 14 15 16 17 18
U N E I
N O P T I
D E
6=
I A R

19 20 21 22 23 24
I A R N A

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

15 / 52

Algoritmul Boyer-Moore

Exemplu
0
V

1
I

2
S

3
U

4
L

6 7 8 9 10 11 12 13 14 15 16 17 18
U N E I
N O P T I
D E
6=
I A

19 20 21 22 23 24
I A R N A

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

15 / 52

Algoritmul Boyer-Moore

Exemplu
0
V

1
I

2
S

3
U

4
L

6 7 8 9 10 11 12 13 14 15 16 17 18
U N E I
N O P T I
D E
6=
I

19 20 21 22 23 24
I A R N A

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

15 / 52

Algoritmul Boyer-Moore

Exemplu
0
V

1
I

2
S

3
U

4
L

6 7 8 9 10 11 12 13 14 15 16 17 18
U N E I
N O P T I
D E
6=
I

19 20 21 22 23 24
I A R N A

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

15 / 52

Algoritmul Boyer-Moore

Exemplu
0
V

1
I

2
S

3
U

4
L

6 7 8 9 10 11 12 13 14 15 16 17 18
U N E I
N O P T I
D E
I

19 20 21 22 23 24
I A R N A
6=
A

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

15 / 52

Algoritmul Boyer-Moore

Exemplu

0
V

1
I

2
S

3
U

4
L

6 7 8 9 10 11 12 13 14 15 16 17 18
U N E I
N O P T I
D E

19 20 21 22 23 24
I A R N A
=
I

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

15 / 52

Algoritmul Boyer-Moore

Exemplu

0
V

1
I

2
S

3
U

4
L

6 7 8 9 10 11 12 13 14 15 16 17 18
U N E I
N O P T I
D E

19 20 21 22 23 24
I A R N A
=
I

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

15 / 52

Algoritmul Boyer-Moore

Exemplu

0
V

1
I

2
S

3
U

4
L

6 7 8 9 10 11 12 13 14 15 16 17 18
U N E I
N O P T I
D E

19 20 21 22 23 24
I A R N A
=
I

10

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

15 / 52

Algoritmul Boyer-Moore

Exemplu

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
pozitii (lungimea sa) la dreapta. Apoi se compara R cu caracterul spatiu. Nici
caracterul spatiu nu apare n pattern asa ca acesta se deplaseaza din nou la
dreapta cu trei pozitii. Procesul continua pana cand R este comparat cu I (al
21-lea caracter din text). Deoarece I apare n pattern pe prima pozitie se
deplaseaza pattern-ul la dreapta cu doua pozitii. Apoi se compara R cu R, deci
exista potrivire. Se continua comparatia cu penultimul caracter din pattern (de
fapt al doilea) si precedentul din text (al 22-lea). Se obtine 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 aparitie a pattern-ului n text.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

16 / 52

Algoritmul Boyer-Moore

Regula caracterului rau 1/3

Engleza: bad character shift rule


Evita repetarea comparatiilor fara succes n cazul caracterelor care nu apar
n pattern sau ntr-un sufix (maximal) al acestuia.

a C apare n pattern
m pozitia ultimei aparitii , dac
salt[C ] = a lui C n pattern

m
, altfel
(alternativ, salt(C ) = max({0} {i < m | p[i] = C }))

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

17 / 52

Algoritmul Boyer-Moore

Regula caracterului rau 2/3


i+salt[A]

i
u

B A nu e in u

caz 1: salt[A] m-j


i+m-j

i
u

B A e in u

caz 2: salt[A] < m-j

Primul caz: i = i + salt[s[i]];


Al doilea caz: i = i + m - j;
D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

18 / 52

Algoritmul Boyer-Moore

Regula caracterului rau 3/3

Daca p[j] 6= s[i] = C ,


1

daca aparitia cea mai din dreapta a lui C n p este k < j, p[k] si s[i]
sunt aliniate (i = i + salt[s[i]])

daca aparitia cea mai din dreapta a lui C n p este k > j, p este
translatat la dreapta cu o pozitie (i = i + m - j)

daca C nu apare n p, patternul p este aliniat cu s[i + 1..i + m] (i = i


+ m). Devine caz particular al primului daca salt[s[i]] = m.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

19 / 52

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)

C
autare peste siruri

PA 2013/2014

20 / 52

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)

C
autare peste siruri

PA 2013/2014

21 / 52

Algoritmul Knuth-Morris-Pratt

Plan

Introducere

Algoritmul Rabin-Karp

Algoritmul Boyer-Moore

Algoritmul Knuth-Morris-Pratt

Algoritmul Z

Algoritmul Boyer-Moore revizuit

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

22 / 52

Algoritmul Knuth-Morris-Pratt

Descriere

Ideea algoritmului este urmatoarea: Atunci cand s-a ntalnit o nepotrivire, i.e.
caracterul curent pj din pattern este diferit de caracterul curent si din text,
caracterele si1 , . . . , sij+1 din text sunt cunoscute deoarece ele exista n
pattern. Pozitia de start pentru urmatoarea comparatie dintre pattern si text
poate fi determinata exploatand aceasta informatie. 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.

Folosind structura de date creata la prima etapa, se proceseaza textul fara a


mai executa ntoarceri.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

23 / 52

Algoritmul Knuth-Morris-Pratt

KMP: ideea

...

...

6=
a

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

24 / 52

Algoritmul Knuth-Morris-Pratt

KMP: ideea

...

...

??
a

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

24 / 52

Algoritmul Knuth-Morris-Pratt

KMP: ideea (cont)


subiect
pattern

...
...

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

25 / 52

Algoritmul Knuth-Morris-Pratt

KMP: ideea (cont)


i

...

subiect

...

pattern

j
...

subiect

...

pattern

...
0

D. Lucanu (FII - UAIC)

...

C
autare peste siruri

...

PA 2013/2014

25 / 52

Algoritmul Knuth-Morris-Pratt

KMP: ideea (cont)


i

...

subiect

...

pattern

j
...

subiect

...

pattern

...

...

...

...

subiect

...

...

pattern

...

0
u
D. Lucanu (FII - UAIC)

...

C
autare peste siruri

j
u
PA 2013/2014

25 / 52

Algoritmul Knuth-Morris-Pratt

Studierea domeniului problemei

u v v u este prefix si sufix al lui v


u @ v u v v si u 6= v
lpps(v ) = cel mai lung prefix si sufix propriu al lui v
Formal:
lpps(v ) v v
(u)u v v = u v lpps(v )
Notatie: lpps i (v ) = lpps(. . . lpps(v ) . . .) de i-ori
lpps 0 (v ) = v

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

26 / 52

Algoritmul Knuth-Morris-Pratt

Studierea domeniului problemei (cont.)


Proprietati ale lui lpps(v ):
Propozitie
lpps i+1 (v ) @ lpps i (v ) @ @ lpps 0 (v ) = v
Teorema
(u, v )u v v (i 0)u = lpps i (v )
Demonstratie. Prin inductie dupa lungimea lui |v | (pe tabla).

sfdem

Corolar
(u, v )v 6=  u @ v (i > 0)u = lpps i (v ).

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

27 / 52

Algoritmul Knuth-Morris-Pratt

Functia esec - descriere


f [j] = k daca si numai daca |lpps(p[0..j 1])| = k
Daca j = 0 atunci f [0] = 1 (putem presupune ca p0 p1
desemneaza sirul vid);
Presupunem j > 0 si ca f [0], . . . , f [j 1] sunt calculate. Consideram
cazul lpps(p[0..j 1]) 6=  (f [j] 6= 0).
Rezulta ca lpps(p[0..j 1]) este de forma up[j 1].
Deoarece u v p[0..j 2], exista i 0, u = lpps i (p[0..j 2]).
Deci u este cel mai mare subsir cu u = lpps i (p[0..j 2]) si
p[|u|] = p[j 1].
De aici obtinem ca f [j] = k + 1, unde k este cel mai mare cu
proprietatile: exista i 0, f [i] = k si p[k] = p[j 1].

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

28 / 52

Algoritmul Knuth-Morris-Pratt

Functia 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)

C
autare peste siruri

PA 2013/2014

29 / 52

Algoritmul Knuth-Morris-Pratt

Exemplu
p = abaabaaabc

0
p[j] a
f[j] -1

-1
a

1
b
0

a
1 b 2

D. Lucanu (FII - UAIC)

2
a
0

3
a
1

4
b
1

5
a
2

6
a
3

4 b 5 a 6 a

C
autare peste siruri

7
a
4

8
b
1

9
c
2

b 9 c

PA 2013/2014

30 / 52

Algoritmul Knuth-Morris-Pratt

Analiza

Invariantul instructiunii for: la sfarsitul executiei fiecarei bucle for, f [j]


este lungimea cel mai lung prefix al lui p care se potriveste n p la pozitia
de sfarsit j 1, adica f [j] = |lpps(p[0..j 1]|.
Timpul n cazul cel mai nefavorabil este O(m). Daca aplatizam for si while
ntr-o singura bucla while, la fiecare pas se mareste cu cel putin o unitate j
sau j k. Rezulta ca vor fi maxim 2m iteratii.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

31 / 52

Algoritmul Knuth-Morris-Pratt

De la algoritmul pentru f [] la algoritmul KMP

...

subiect

...

...

pattern

...

...

...

subiect

...

pattern

...
0

...

...

Se considera s[i] n loc de p[j] si j n loc de k.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

32 / 52

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)

C
autare peste siruri

PA 2013/2014

33 / 52

Algoritmul Knuth-Morris-Pratt

Analiza

Invariantul primei instructiuni while: la sfarsitul executiei fiecarei bucle


while, p[0..j 1] este cel mai lung prefix al lui p care se potriveste n s la
pozitia de sfarsit i 1.
Rezulta ca dupa terminarea instructiunii while interioare, p[0..j] este cel
mai lung prefix al lui p care se potriveste n s la pozitia de sfarsit i.
Timpul n cazul cel mai nefavorabil este O(n + m). Daca aplatizam cele
doua bucle while ntr-o singura bucla, la fiecare pas se mareste cu cel putin
o unitate i sau i j. Rezulta ca vor fi maxim m + n iteratii.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

34 / 52

Algoritmul Z

Plan

Introducere

Algoritmul Rabin-Karp

Algoritmul Boyer-Moore

Algoritmul Knuth-Morris-Pratt

Algoritmul Z

Algoritmul Boyer-Moore revizuit

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

35 / 52

Algoritmul Z

Domeniul problemei: definitia pentru Z [j]

Fie p[0..m 1] un sir.


Z [j] = lungimea celui mai lung subsir care pleaca din p[j] si este prefix al
lui p.
Exercitiu. Sa se dea o definitie formala pentru Z [j].

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

36 / 52

Algoritmul Z

Algoritmul Z - invariant

L

u

Algorimul Z, care calculeaza valorile Z [j], j = 1, . . . , m 1, mentine


urmatorul invariant:
[L, R] este un interval cu R maxim astfel ncat
1 L j R si
p[L..R] este prefix al lui p.
Daca nu exista un astfel de interval atunci L = R = 1.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

37 / 52

Algoritmul Z

Algoritmul Z - iteratia curenta 1/3

Presupunem toate valorile pana la Z [j 1] calculate.


Pentru calculul lui Z [j] distingem urmatoarele cazuri:
j > R (i.e. j 1 = R). Nu exista un prefix al lui p care se termina la
j sau dupa j.
Se reseteaza L si R pentru p[0..] si p[j..]:
L = R = j;
// reseteaza L si R
while (R < M && p[R-L] == p[R])
R = R + 1;
// p[j..R-1] cel mai lung prefix
Z[j] = R - L; // = |p[j..R-1]|
R = R -1;

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

38 / 52

Algoritmul Z

Algoritmul Z - iteratia curenta 2/3


j R. [L, R] se extinde. Fie k = j L. Avem
Z [j] min{Z [k], R j + 1} (explicatii pe tabla)
Distingem subcazurile:
Z [k] < R j + 1. Nu exista prefix mai lung care pleaca din j:
Z[j] = Z[k];
Z [k] R j + 1. Exista un prefix mai lung ce pleaca din j. Se
reseteaza L la j si se calculeaza noul R pornind de la R + 1:
L = j;
while (R < m && p[R-L] == p[R])
R = R + 1;
// p[L..R-1] cel mai lung prefix
Z[j] = R - L; // = |p[L..R-1]|
R = R - 1;

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

39 / 52

Algoritmul Z

Algoritmul Z - iteratia curenta 3/3


asamblam cazurile:
if (j > R) {
L = R = j;
while (R < M && p[R-L] == p[R])
R = R + 1;
Z[j] = R - L;
R = R -1;
} else {
k = j - L;
if (Z[k] < R-j+1)
Z[j] = Z[k];
else {
L = j;
while (R < m && p[R-L] == p[R])
R = R + 1;
Z[j] = R - L;
R = R - 1;
}
D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

40 / 52

Algoritmul Boyer-Moore revizuit

Plan

Introducere

Algoritmul Rabin-Karp

Algoritmul Boyer-Moore

Algoritmul Knuth-Morris-Pratt

Algoritmul Z

Algoritmul Boyer-Moore revizuit

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

41 / 52

Algoritmul Boyer-Moore revizuit

Motivatie

Regula caracterului rau nu este eficienta daca alfabetul este mic.


In astfel de cazuri se poate castiga n eficienta daca se considera sufixele
potrivite deja.
Asta este realizata de regula sufixului bun.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

42 / 52

Algoritmul Boyer-Moore revizuit

Regula sufixului bun: ilustrare caz 1


0

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 c a b b a c b a b a b b a b b c b a b
a a b a b b c b a b
0

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 c a b b a c b a b a b b a b b c b a b
a a b a b b c b a b
0

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

43 / 52

Algoritmul Boyer-Moore revizuit

Regula sufixului 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 6= p[j 1], se face salt la cea mai apropiata copie
din stanga cu aceasta proprietate.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

44 / 52

Algoritmul Boyer-Moore revizuit

Regula sufixului bun: ilustrare caz 2


0

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 c a b b a c b a b a b b a b b c b a b
a b b a b c b c a b
0

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 c a b b a c b a b a b b a b b c b a b
a b b a b c b c a b
0

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

45 / 52

Algoritmul Boyer-Moore revizuit

Regula sufixului bun: cazul 2 formal

Cazul 2:
daca nu se aplica regula din cazul 1, se face saltul cel mai mic astfel
ncat un sufix al lui s[0..i] se potriveste cu un prefix al lui p
daca cel mai lung prefix al lui s[0..i] care se potriveste peste un prefix al
lui p este sirul vid, atunci se face un salt cu m pozitii

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

46 / 52

Algoritmul Boyer-Moore revizuit

goodSuff (j) - definitie (cazul 1)

goodSuff (j) = pozitia de sfarsit a aparitiei lui p[j..m 1] cea mai


apropiataa de j si care nu este precedata de p[j 1].
Daca nu exista o astfel de copie, goodSuff (j) = 0.
Avem 0 goodSuff (j) < m 1;
daca goodSuff (j) > 0 atunci el reprezinta o copie a unui sufix bun
care permite un salt de m goodSuff (j) pozitii
deoarece p[m..m 1] este sirul vid, goodSuff (m) = cea mai din dreapta
pozitie k cu p[k] 6= p[m 1] (1 daca toate caracterele sunt egale).

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

47 / 52

Algoritmul Boyer-Moore revizuit

goodSuff (j) - calcul

lcs(j, p) = lungimea celui mai lung sufix comun lui p[0..j] si p.


Lema
Valorile lcs(j, p) pot fi calculate n timpul O(m).
Exercitiu Sa se demonstreze lema. (se utilizeaza algoritmul Z adaptat).
Teorema
Daca goodSuff (j) > 0, atunci goodSuff (j) este cel mai mare k < m 1
cu lcs(k, p) = m j (= |p[j..m 1]|).
Rezulta ca valorile goodSuff (j) pot fi calculate n timpul O(m).

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

48 / 52

Algoritmul Boyer-Moore revizuit

Preprocesarea n cazul 2

lp(j) = lungimea celui mai lung prefix al lui p care este sufix al lui
p[j..m 1].
Lema
lp(j) = max{k | 0 k |p[j..m 1]| lcs(k, p) = k}.
Exercitiu Sa se demonstreze lema.
Rezulta ca valorile lp(j) pot fi calculate n timpul O(m).

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

49 / 52

Algoritmul Boyer-Moore revizuit

Regula sufixului bun

Presupunem ca p[j 1] nu se potriveste (dupa ce s-au potrivit p[j..m 1].


1

daca goodSuff (j) > 0, face un salt egal cu m goodSuff (j) (cazul 1)

daca goodSuff (j) = 0, face un salt egal cu m lp(j) (cazul 2)

Daca p[m 1] nu se potriveste, atunci j = m si saltul este corect.

D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

50 / 52

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 pozit
ia p[j]
m
are
ste k cu maximul dintre salturile date de
regula caracterului r
au
si regula sufixului bun
}
}
D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

51 / 52

Algoritmul Boyer-Moore revizuit

Analiza
Teorema
Algoritmul BM executa totdeauna cel mult m + n comparatii de caractere si
n
aproximativ
salturi cand alfabetul nu este mic si pattern-ul nu este
m
prea lung.
Observatie: Daca alfabetul are numai doua caractere (cazul sirurilor
binare), atunci performantele algoritmului BM nu sunt cu mult mai bune
decat cele ale cautarii naive. In acest caz se recomanda mpartirea sirurilor
n grupe cu un numar fixat de biti. Fiecare grupa reprezinta un caracter.
Daca dimensiunea unei grupe este k atunci vor exista 2k caractere, i.e.
dintr-un alfabet mic obtinem unul cu multe caractere. Totusi, k va trebui
ales suficient de mic pentru ca dimensiunea tabelei de salturi sa nu fie prea
mare.
sfobs
D. Lucanu (FII - UAIC)

C
autare peste siruri

PA 2013/2014

52 / 52

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