Title: Cursul 3
1Cursul 3
- Cautare peste siruri
- problema
- cautarea naiva
- algoritmul Knuth-Morris-Pratt
- algoritmul Boyer-Moore
- algoritmul Rabin-Karp
- cazul mai multor pattern-uri
- expresii regulate
2Tipul de date abstract String
- obiecte siruri de elemente apartinind unui tip
abstract Character - operatii
- inserarea unui subsir
- eliminarea unui subsir
- concatenarea a doua siruri
- regasirea unui sir ca subsir al altui sir
- sirul in care se cauta se numeste subiect il
notam s0..n-1 - sirul a carui aparitie este cautata in subiect se
numeste pattern il notam p0..m-1
3Cautare naiva proprietati
- nu necesita preprocesare
- spatiu suplimentar O(1)
- totdeauna deplaseaza pattern-ul cu o unitate la
dreapta
s
?
p
- comparatiile pot fi facute in orice ordine
- complexitatea cautarii O(m?n)
- numarul mediu de comparatii intre caractere 2n
.
4Cautarea naiva algoritm
- function pmNaiv(s, n, p, m)
- begin
- i ? -1
- while (i lt n-m) do
- i ? i1
- j ? 0
- while (sij pj) do
- if (j m-1)
- then return i
- else j ? j1
- return -1
- end
5Algoritmul KMP proprietati
- realizeaza comparatiile de la stanga la dreapta
- preprocesare in timpul O(m) cu spatiu suplimentar
O(m) - complexitatea timp a cautarii O(nm)
(independent de marimea alfabetului)
6Algoritmul KMP ideea
a b a b
?
?
a b a b c
7Algoritmul KMP ideea
?
8Algoritmul KMP functia esec
- procedure determinaFctEsec(p,m,f)
- begin
- f0 ? -1
- for j ? 1 to m-1 do
- k ? fj-1
- while (k ? -1 and pj-1 ? pk) do
- k ? fk
- fj ? k1
- end
9Algoritmul KMP functia esec exemplu
i 0 1 2 3 4 5 6 7 8 9
pi a b a a b a a a b c
fi -1 0 0 1 1 2 3 1 1 2
10Algoritmul KMP
- function KMP(s, n, p, m, f)
- begin
- i ? 0
- j ? 0
- while (i lt n) do
- while (j ? -1 and si ? pj)do
- j ? fj
- if (j m-1)
- then return i-m1
- else i ? i1
- j ? j1
- return -1
- end
11Algoritmul Boyer-Moore proprietati
- comparatiile sunt realizate de la dreapta la
stanga - preprocesare in timpul O(km) si spatiu
suplimentar O(k), unde k Character - complexitatea timp a cautarii O(mn)
- 3n comparatii de caractere in cazul cel mai
nefavorabil pentru un pattern neperiodic - cea mai buna performanta O(n / m) .
12Algoritmul Boyer-Moore ideea
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
V I S U L U N E I N O P T I D E I A R N A
?
?
?
?
?
?
?
I A R
0 1 2
I A R
0 1 2
I A R
0 1 2
I A R
0 1 2
I A R
0 1 2
I A R
0 1 2
I A R
0 1 2
I A R
0 1 2
0
1
2
3
4
5
6
7
8
9
10
13Algoritmul Boyer-Moore functia salt
- cazul cind caracterul apare o singura data in
pattern - AMAR
- MAR
- saltA 1
- cazul cind caracterul apare de mai multe ori in
pattern - SAMAR
- AMAR
- saltA 1
14Algoritmul Boyer-Moore salt
isaltA
A B A nu e in u
j
saltA m-j
im-j
A B A e in u
j
saltA lt m-j
15Algoritmul Boyer-Moore
- function BM(s, n, p, m, salt)
- begin
- i ? m-1 j ? m-1
- repeat
- if (si pj)
- then i ? i-1
- j ? j-1
- else
- if (m-j) gt saltsi
- then i ? im-j
- else i ? isaltsi
- j ? m-1
- until (jlt0 or igtn-1)
- if (jlt0)
- then return i1
- else return -1
- end
16Algoritmul Rabin-Karp proprietati
- utilizeaza o functie hash
- preprocesare in timpul O(m) si spatiu suplimentar
O(1) - cautare in timpul O(mn)
- timpul mediu O(nm) .
17Algoritmul Rabin-Karp ideea
p
0 m-1
s
i im-1
i1 im
s
18Algoritmul Rabin-Karp
- function RK(s, n, p, m)
- begin
- dlam1 ? 1
- for i ? 1 to m-1 do dlam1 ? (ddlam1)q
- hp ? 0
- for i ? 0 to m-1 do hp ? (dhpindex(pi))q
- hs ? 0
- for i ? 0 to m-1 do hs ? (dhsindex(si))q
- i ? 0
- while (i lt n-m) do
- if (hp hs and equal(p, s, m, i))
- then return i
- hs ? (hsdq-index(si)dlam1)q
- hs ? (dhsindex(sim))q
- i ? i1
- return -1
- end
19Algoritmul Rabin-Karp implementare C
- define REHASH(a, b, h) ((((h)-(a)d) ltlt 1) (b))
- int RK(char p, int m, char s, int n)
- long d, hs, hp, i, j
- / Preprocesare /
- for (d i 1 i lt m i)
- d (d ltlt 1)
- for (hp hs i 0 i lt m i)
- hp ((hp ltlt 1) pi)
- hs ((hs ltlt 1) si)
-
- / Cautare /
- i 0
- while (i lt n-m)
- if (hp hs memcmp(p, s i, m) 0)
- return i
- hs REHASH(si, si m, hs)
- i
-
- return -1
20Mai multe pattern-uri
21Mai multe pattern-uri (continuare)
C
B
E
D
2
3
1
4
5
A
E
C
D
6
7
8
0
B
C
10
9
22Expresii regulate
- definitia expresiilor regulate peste A
- ltexpr_reggt a e empty
- (?expr_reg??expr_reg?)
- (?expr_reg? ?expr_reg?)
- ?expr_reg?
- limbajul definit de expresiile regulate
- L(a) a
- L(e) e
- L(empty) Ø
- L(e1e2) L(e1)L(e2) uv u ?L(e1), v ? L(e2)
- L(e1e2) L(e1) ? L(e2)
- L(e) ?iL(ei) ?iL(e)i
23Automatul asociat unei expresii regulate
a ? A
e
empty
e1
e2
24Automatul asociat unei expresii regulate
(continuare)
(e1e2)
(e1 e2)
e1
25Automatul asociat unei expresii regulate exemplu
e a(bacd)
s abbcacdaaab
26Algoritm de cautare structuri de date
- D coada cu restrictii la iesire, unde
inserarile se pot face si la inceput si la
sfarsit iar stegerile/citirile numai la inceput. - q starea curenta a automatului,
- j pozitia curenta in textul s, i pozitia in
textul s de inceput a "pattern"-ului curent - Simbolul va juca rolul de delimitator (el poate
fi inlocuit cu starea invalida -1). - Initial avem D (), q 1 (prima stare dupa
starea initiala 0), - i j 1.
27Algoritm de cautare pasul curent
- Daca
- din q pleaca doua arce neetichetate , atunci
insereaza la inceput in D destinatiile celor doua
arce - din q pleaca un singur arc etichetat cu sj
atunci insereaza la sfarsitul lui D destinatia
arcului - q este delimitatorul atunci
- daca D Ø, atunci incrementeaza i, j devine noul
i, insereaza in D si atribuie 1 lui q (aceasta
corespunde situatiei cand au fost epuizate toate
posibilitatile de a gasi in text o aparitie a
unui sir specificat de "pattern" care incepe la
pozitia i) - daca D ? Ø, atunci incrementeaza j si insereaza
la sfarsitul lui D - q este starea finala atunci s-a gasit o aparitie
a unui sir specificat de "pattern" care incepe la
pozitia i. - Extrage starea de la inceputul lui D si o
memoreaza in q