ASD Ćwiczenia 13

Z Studia Informatyczne
Wersja z dnia 16:25, 23 sie 2006 autorstwa Rytter (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

Problem minimalnego pokrywającego słowa

Słowem pokrywającym tekst x taki tekst y, którego wystąpienia w x pokrywają cały tekst x. Na przykład aba pokrywa ababaaba, natomiast nie pokrywa tekstu abaaababa. Obliczyć długość najkrótszego słowa pkrywającego dany tekst x.

Odpowiedz.

Niech S[i] będzie rozmiarem minimalnego pokrywajćego słowa dla prefiksu x[1..i]. Algorytm wykorzystuje następujący fakt: \ S[i]=i lub S[i]=S[P[i]]. \ Następujący algorytm liczy długość minimalnego słowa pokrywającego tekstu x. Liczymy wartości S[i] najmniejszej długości minimalnego słowa pokrywającego x[1i] dla każdego 1in. W i-tej iteracji algorytm pamięta jaki jest ``znany zakres każdego minimalnego słowa pokrywającego.


Rysunek 3: i-ta iteracja algorytmu, dla i=15, oraz słowa x = abaabababaababa. Tuż przed rozpoczęciem tej iteracji mamy P[i]=8, q=S[8]=3, Zakres[3]=13. Po zakończeniu i-tej iteracji

mamy S[15]=3,Zakres[3]=15, ponieważ iZakres[3]q.

Algorytm Rozmiar-Minimalnego-Pokrycia


for i:=2 to n do
   Zakres[i]=i,S[i]=i

for i:=2 to n do
   if P[i]>0 oraz iZakres[S[P[i]]S[P[i]] then
      S[i]:=S[P[i]]; Zakres[S[P[i]]:=i;

return S[n];