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;