Documente Academic
Documente Profesional
Documente Cultură
SDA Curs9 Info PDF
SDA Curs9 Info PDF
Are drept scop stabilirea pozitiei primei aparitii a sirului p in sirul s; rezultatul
cautarii este indicele i al primei aparitii
char s[N];
char p[M]; /* M<<N*/
Precizarea coincidentei se face cu P(i,j):
P(i,j) A k: 0 <= k < j : s i+k == p k
In cazul in care P(i,j) este adevarat, avem o coincidenta de j caractere
incapand cu pozitia i in sirul s; pentru a avea o coincidenta pe lungimea M este
necesar sa fie adevarat P(i, M)
Precizarea primei aparitii se face cu Q(i):
Q(i) A k : 0 <= k < i : ~P(k, M)
Cautarea directa lucreaza destul de repede daca se presupune ca nepotrivirea
dintre s si p apare dupa cel mult cateva comparatii O(N)
Cel mai defavorabil caz este cand nepotrivirea dintre s si p apare totdeauna pe
ultimul caracter din p O(N*M)
Eficienta scazuta: modelul p avanseaza cu o singura pozitie dupa o nepotrivire
s …ABCABC… s…ABCABC
p ABCABE… j=5; dj=2 p ABCABE…
s …ABCABD….. S …ABCABD…….
p ABCABC j=5; dj=0 P ABCABC
s…ABCDEF… s…ABCDEF…
p ABCDEA j=5; dj=-1 p ABCDEA
Precompilare
p d
A -1
AA -1-1
AAAAAB -1-1-1-1-14
ABCABC -100-100
ABCABCD -100-1003
ABCABD -100-102
MARGINE -1000000
i=M;j=M;
while( j>0 && i<=N )
{
j=M;k=i;
while( j>0 && s[k-1]==p[j-1] )
{
k=k-1;
j=j-1;
}
if( j>0) i=i+d[s[k-1]];
}
poz=i-M;