Cursul 3 Cautare peste siruri problema cautarea naiva
Cursul 3 Ø Cautare peste siruri ð problema ð cautarea naiva ð algoritmul Knuth-Morris-Pratt ð algoritmul Boyer-Moore ð algoritmul Rabin-Karp ð cazul mai multor pattern-uri ð expresii regulate
Tipul 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 s[0. . n-1] – sirul a carui aparitie este cautata in subiect se numeste “pattern”; il notam p[0. . m-1]
Cautare 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: 2 n.
Cautarea naiva: algoritm function pm. Naiv(s, n, p, m) begin i -1 while (i < n-m) do i i+1 j 0 while (s[i+j] = p[j]) do if (j = m-1) then return i else j j+1 return -1 end
Algoritmul KMP: proprietati Ø realizeaza comparatiile de la stanga la dreapta; Ø preprocesare in timpul O(m) cu spatiu suplimentar O(m); Ø complexitatea timp a cautarii: O(n+m) (independent de marimea alfabetului);
Algoritmul KMP: ideea a b * ? ≠ a b c …
Algoritmul KMP: ideea i . . . subiect . . . pattern j. . . subiect . . . i pattern . . k 0 j . . . subiect . . . i . . . pattern 0 . . . k . . . j
Algoritmul KMP: functia esec procedure determina. Fct. Esec(p, m, f) begin f[0] -1 for j 1 to m-1 do k f[j-1] while (k -1 and p[j-1] p[k]) do k f[k] f[j] k+1 end
Algoritmul KMP: functia esec: exemplu p = abaabaaabc i p[i] f[i] 0 -1 a 0 a -1 1 b 0 a b 1 2 2 a 0 3 a 1 3 a 4 b 1 5 a 2 6 a 3 4 b 5 a 6 a 7 a 1 8 b 1 7 a 9 c 2 8 b 9 c
Algoritmul KMP function KMP(s, n, p, m, f) begin i 0 j 0 while (i < n) do while (j -1 and s[i] p[j])do j f[j] if (j = m-1) then return i-m+1 else i i+1 j j+1 return -1 end
Algoritmul 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); Ø 3 n comparatii de caractere in cazul cel mai nefavorabil pentru un “pattern” neperiodic; Ø cea mai buna performanta: O(n / m).
Algoritmul Boyer-Moore: ideea 0 1 V I 2 3 4 5 S U L ≠ 6 7 8 9 1 0 U N E I 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 ≠ ≠ A R I A R I 0 1 1 1 0 A R N A = ≠ = = ≠ 2 2 2 I ≠ 0 2 1 D E ≠ 2 2 0 N O P T I I 2 1 9 2 10 0123456789 0 2 0 A RI A R 1 20 1 2 2 3 2 4
Algoritmul Boyer-Moore: functia salt Ø cazul cind caracterul apare o singura data in pattern AMAR salt[A] = 1 Ø cazul cind caracterul apare de mai multe ori in pattern SAMAR salt[A] = 1
Algoritmul Boyer-Moore: salt i+salt[‘A’] i ‘A’ u ‘B’ ‘A’ nu e in u j salt[‘A’] ≥ m-j i+m-j i ‘A’ u ‘B’ ‘A’ e in u j salt[‘A’] < m-j
Algoritmul Boyer-Moore function BM(s, n, p, m, salt) begin i m-1; j m-1 repeat if (s[i] = p[j]) then i i-1 j j-1 else if (m-j) > salt[s[i]] then i i+m-j else i i+salt[s[i]] j m-1 until (j<0 or i>n-1) if (j<0) then return i+1 else return -1 end
Algoritmul 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(n+m).
Algoritmul Rabin-Karp: ideea p 0 m-1 s i i+m-1 s i+1 i+m
Algoritmul Rabin-Karp function RK(s, n, p, m) begin dlam 1 1 for i 1 to m-1 do dlam 1 (d*dlam 1)%q hp 0 for i 0 to m-1 do hp (d*hp+index(p[i]))%q hs 0 for i 0 to m-1 do hs (d*hs+index(s[i]))%q i 0 while (i < n-m) do if (hp = hs and equal(p, s, m, i)) then return i hs (hs+d*q-index(s[i])*dlam 1)%q hs (d*hs+index(s[i+m]))%q i i+1 return -1 end
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; }
Mai multe pattern-uri 1 B 2 C 3 A 0 C 6 D 7 9 C 10 B E 8 D 4 E 5
Mai multe pattern-uri (continuare) 1 B 2 C 3 A 0 C 6 D 7 9 C 10 B E 8 D 4 E 5
Expresii regulate Ø definitia expresiilor regulate peste A <expr_reg> : : = a | ε | empty | ( expr_reg ) | ( expr_reg + expr_reg ) | expr_reg * Ø limbajul definit de expresiile regulate ð L(a) = {a} ð L(ε) = {ε} ð L(empty) = Ø ð L(e 1 e 2) = L(e 1)L(e 2) = {uv | u L(e 1), v L(e 2)} ð L(e 1+e 2) = L(e 1) L(e 2) ð L(e*) = i. L(ei) = i. L(e)i
Automatul asociat unei expresii regulate a A a ε empty e 1 A 1 e 2 A 2
Automatul asociat unei expresii regulate (continuare) (e 1 e 2) A 1 A 2 (e 1 + e 2) A 1 A 2 e 1* A 1
Automatul asociat unei expresii regulate: exemplu e = a(b*a+cd) b 3 1 a 4 5 a 2 6 s = abbcacdaaab c 7 d
Algoritm 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.
Algoritm 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 s[j] 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
- Slides: 27