Mai intai trebuie sa te autentifici.
Diferente pentru automate-finite-si-kmp intre reviziile #30 si #31
Nu exista diferente intre titluri.
Diferente intre continut:
h2. Algoritmul KMP
Gaseste toate aparitiile un string $N$ in $M$ in timp {$O(n + m)$}, unde {$n = lungime(N)$}, {$m = lungime(M)$}. O parte esentiala a sa este functia prefix $Π : {1..n} -> {0..n-1}$ unde $Π{~i~}$ = cel mai lung prefix al lui $M$ care este sufix al lui {$M{~i~}$}. Evident, M{~Π{~i~}~} (prefixul de lungime Π{~i~} al lui {$M$}) prefix al lui {$M{~i~}$}, deci {$Π{~i~} < i$}.
Gaseste toate aparitiile unui string $N$ in $M$ in timp {$O(n + m)$}, unde {$n = lungime(N)$}, {$m = lungime(M)$}. O parte esentiala a sa este functia prefix $π : {1..n} -> {0..n-1}$ unde $π{~i~}$ = cel mai lung prefix al lui $M$ care este sufix al lui {$M{~i~}$}. Evident, M{~π{~i~}~} (prefixul de lungime π{~i~} al lui {$M$}) prefix al lui {$M{~i~}$}, deci {$π{~i~} < i$}.
h3. Algoritm_calcul_functie_prefix
mult $n - 1$ ori pe parcursul algoritmului * => Complexitate : $O(n)$
Algoritmul este similar cu constructia automatului de acceptare. Din fiecare stare $i$ in care s-a acceptat {$N{~i~}$}, vedem cat de mult putem lua de la sfarsitul lui {$N{~i~}$} astfel incat sufixul respectiv sa fie prefix pentru {$N$}. De remarcat ca in cazul in care starea candidata $k$ nu este buna, nu mergem in {$k - 1$}, ci in {$Π{~k~}$}. Aceasta este de fapt "magia" care ofera complexitate liniara.
Algoritmul este similar cu constructia automatului de acceptare. Din fiecare stare $i$ in care s-a acceptat {$N{~i~}$}, vedem cat de mult putem lua de la sfarsitul lui {$N{~i~}$} astfel incat sufixul respectiv sa fie prefix pentru {$N$}. De remarcat ca in cazul in care starea candidata $k$ nu este buna, nu mergem in {$k - 1$}, ci in {$π{~k~}$}. Aceasta este de fapt "magia" care ofera complexitate liniara.
Algoritmul de potrivire este similar celui al calculului functiei prefix, numai ca aici la fiecare pas $i$ cautam cel mai lung prefix al lui $N$ care este sufix al lui {$M{~i~}$}.