Algorytm Morrisa

Transkrypt

Algorytm Morrisa
Algorytm Morrisa-Pratta
Oznaczymy przez m = długość tablicy T, n=długość wzorca P, m<=n.
Algorytm najpierw przegląda tekst od lewej do prawej sprawdzając czy zachodzi zgodność j+1 we
wzorcu oraz na pozycji i+j+1 w tekście. Jeśli nie ma zgodności wówczas przesuwamy początek
sprawdzania (pozycja i) wystąpienia wzorca w tekście. W algorytmie tym wykorzystywana jest
tablica prefikso-sufiksów.
Prefikso-sufiks jest to najdłuższy właściwy (nie będący całym tekstem) prefiks tekstu będący
jednocześnie jego sufiksem.
Przez PS[k] oznaczamy rozmiar prefikso-sufiksu słowa [1,..k].
Na przykład dla słowa:
abababababb
mamy:
PS[1,..,11] = [0,0,1,2,3,4,5,6,7,8,0].
PS[0] przyjmujemy za -1.
Sprawdźmy:
PS[1] = a – mamy zero ponieważ nie istnieje słowo nie będące całym tekstem.
PS[2] = ab – mamy zero ponieważ nie istnieje słowo nie będące całym tekstem
PS[3] = aba – mamy 1, ponieważ maksymalna długość prefikso-sufiksu wynosi 1 (a)
PS[4] abab – mamy 2, ponieważ maksymalna długość prefikso-sufiksu wynosi 2 (ab)
PS[5] ababa – mamy 3, maksymalna dlugosc prefikso-sufiksu wynosi 3 (aba).
...
PS[11] = 0 (ponieważ prefikso-sufiks nie może być całym słowem).
Algorytm obliczania tablicy prefikso-sufiksow:
Wyznaczanie tablicy wielkości prefikso-sufiksów:
1
PS[0] = -1; t=-1;
2
for j=1 to m do
3
begin
4
while t>=0 and x[t+1] != x[j] do t=PS[t];
5
t=t+1; PS[j]=t;
6
end;
Algorytm MP
1
i=0; j=0;
2
while i<= n-m do begin
3
while j<m and P[j+1] = T[i+j+1] do j=j+1;
4
if j==m then return („znaleziono wzorzec”)
5
i= i+j – PS[j]; j=max(0,PS[j])
6
end;

Podobne dokumenty