Documente Academic
Documente Profesional
Documente Cultură
Dorel Lucanu
Faculty of Computer Science
Alexandru Ioan Cuza University, Iasi, Romania
dlucanu@info.uaic.ro
PA 2013/2014
C
autare peste siruri
PA 2013/2014
1 / 52
Outline
Introducere
Algoritmul Rabin-Karp
Algoritmul Boyer-Moore
Algoritmul Knuth-Morris-Pratt
Algoritmul Z
C
autare peste siruri
PA 2013/2014
2 / 52
Introducere
Plan
Introducere
Algoritmul Rabin-Karp
Algoritmul Boyer-Moore
Algoritmul Knuth-Morris-Pratt
Algoritmul Z
C
autare peste siruri
PA 2013/2014
3 / 52
Introducere
Problema
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.
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
C
autare peste siruri
PA 2013/2014
6 / 52
Algoritmul Rabin-Karp
Descriere
C
autare peste siruri
PA 2013/2014
7 / 52
Algoritmul Rabin-Karp
C
autare peste siruri
PA 2013/2014
8 / 52
Algoritmul Rabin-Karp
Tabela hash
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
C
autare peste siruri
PA 2013/2014
11 / 52
Algoritmul Rabin-Karp
C
autare peste siruri
PA 2013/2014
12 / 52
Algoritmul Rabin-Karp
Analiza impelementarii C
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
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
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
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
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
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
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
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
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
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
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
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.
C
autare peste siruri
PA 2013/2014
16 / 52
Algoritmul Boyer-Moore
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 }))
C
autare peste siruri
PA 2013/2014
17 / 52
Algoritmul Boyer-Moore
i
u
B A nu e in u
i
u
B A e in u
C
autare peste siruri
PA 2013/2014
18 / 52
Algoritmul Boyer-Moore
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)
C
autare peste siruri
PA 2013/2014
19 / 52
Algoritmul Boyer-Moore
C
autare peste siruri
PA 2013/2014
20 / 52
Algoritmul Boyer-Moore
Analiza
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
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
C
autare peste siruri
PA 2013/2014
23 / 52
Algoritmul Knuth-Morris-Pratt
KMP: ideea
...
...
6=
a
C
autare peste siruri
PA 2013/2014
24 / 52
Algoritmul Knuth-Morris-Pratt
KMP: ideea
...
...
??
a
C
autare peste siruri
PA 2013/2014
24 / 52
Algoritmul Knuth-Morris-Pratt
...
...
C
autare peste siruri
PA 2013/2014
25 / 52
Algoritmul Knuth-Morris-Pratt
...
subiect
...
pattern
j
...
subiect
...
pattern
...
0
...
C
autare peste siruri
...
PA 2013/2014
25 / 52
Algoritmul Knuth-Morris-Pratt
...
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
C
autare peste siruri
PA 2013/2014
26 / 52
Algoritmul Knuth-Morris-Pratt
sfdem
Corolar
(u, v )v 6= u @ v (i > 0)u = lpps i (v ).
C
autare peste siruri
PA 2013/2014
27 / 52
Algoritmul Knuth-Morris-Pratt
C
autare peste siruri
PA 2013/2014
28 / 52
Algoritmul Knuth-Morris-Pratt
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;
}
}
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
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
C
autare peste siruri
PA 2013/2014
31 / 52
Algoritmul Knuth-Morris-Pratt
...
subiect
...
...
pattern
...
...
...
subiect
...
pattern
...
0
...
...
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
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
C
autare peste siruri
PA 2013/2014
35 / 52
Algoritmul Z
C
autare peste siruri
PA 2013/2014
36 / 52
Algoritmul Z
Algoritmul Z - invariant
L
u
C
autare peste siruri
PA 2013/2014
37 / 52
Algoritmul Z
C
autare peste siruri
PA 2013/2014
38 / 52
Algoritmul Z
C
autare peste siruri
PA 2013/2014
39 / 52
Algoritmul Z
C
autare peste siruri
PA 2013/2014
40 / 52
Plan
Introducere
Algoritmul Rabin-Karp
Algoritmul Boyer-Moore
Algoritmul Knuth-Morris-Pratt
Algoritmul Z
C
autare peste siruri
PA 2013/2014
41 / 52
Motivatie
C
autare peste siruri
PA 2013/2014
42 / 52
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
C
autare peste siruri
PA 2013/2014
43 / 52
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.
C
autare peste siruri
PA 2013/2014
44 / 52
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
C
autare peste siruri
PA 2013/2014
45 / 52
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
C
autare peste siruri
PA 2013/2014
46 / 52
C
autare peste siruri
PA 2013/2014
47 / 52
C
autare peste siruri
PA 2013/2014
48 / 52
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).
C
autare peste siruri
PA 2013/2014
49 / 52
daca goodSuff (j) > 0, face un salt egal cu m goodSuff (j) (cazul 1)
C
autare peste siruri
PA 2013/2014
50 / 52
C
autare peste siruri
PA 2013/2014
51 / 52
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