1 Wst ep Rozważamyproblemznajdowaniawszystkichwyst apień wzorca x o długości mwtekścieyodługościn.zakładamy,żemjestistotniemniejszeniżn,nie jest istotny dla nas czas preprocessingu wzorca x, lecz liczba porównań liter z tekstem y. Zakładamy również, że czytelnik jest obeznany z algorytmem Morrissa-Prattanawyszukiwaniewszystkichwyst apień wzorca w tekście. Algorytm Morrissa-Pratta wykonuje pesymistycznie około n porównań literztekstuxzliteramiztekstuy.jakoprzykładweźmyx=a m 1 b,y=a n. Wówczas algorytm Morrisa-Pratta, po porównaniu pierwszych m 1 liter a istwierdzeniu,żes a one zgodne, dla każdej kolejnej litery tekstu y: 1.b edziemiałzapami etane,żeznalazłjużm 1literwzorcax;.sprawdzi,żeaktualnaliteratekstuniepasujedowzorcax,tjy[i]= a b=x[m];.dokonaprzesuni eciazgodnieztablic a P wzorca x, najdłuższym presiksosufiksemsłowaa m 1 =x[1...m 1]jesta m ; 4. sprawdzi, że aktualna litera tekstu pasuje do wzorca x na pozycji m 1, tjy[i]=a=x[m 1]; 5.uaktualniinformacj e,żeznalazłjużm 1literwzorcaxiprzesuniesi e donast epnejliterytekstu. Wsumie,algorytmwykonan m+1porównań,coprzyzałożenium n jest bliskie n. Poniżej przedstawimy algorytm, który w pesymistycznym wypadkudokonuje nporównańtekstuzwzorcemprzypreprocessinguwzorca xwczasieo(n)ipami ecio(n).algorytmtenjestnieznaczn amodyfikacj a algorytmu Morrissa-Pratta. O tekście x zakładamy, że zawiera przynajmniej dwieróżnelitery;znajdowaniewyst apieńwzorcaa m wdokładnienporównaniachmamynadziej e,żenieprzedstawiaczytelnikowyżadnychproblemów. Algorytm.1 Preprocessing Otekściexchcemywiedziećnast epuj ace dwie rzeczy: 1.Chcemymiećskonstruowan atablic epwzorcax,t asam acoużywana jestwalgorytmiemorrissa-pratta;tjp[i]jestdługości a najdłuższego prefikso-sufiksusłowax[1...i]. 1
.Załóżmy,żepierwsz aliter asłowaxjesta,zaśpierwsz aróżn aoda liter asło waxjestbipierwszyrazwyst epujeonanapozycjik.innymisłowy,x[1...k]=a K 1 b.zauważmy,że K m.wtrakcie preprocessingutekstuxzapami etujemywartośćk. Zauważmy,żedlakażdegoi Kmamyi P[i] K,gdyżwiemy,że x[1...k]=a K 1 b:prefikso-sufikssłowazaczynaj acegosi edoa K 1 bmusi zaczynaćsi ezat aliter abwwyst apieniu jako sufiks.. Treśćalgorytmu Poniżej zamieszczamy pseudokod algorytmu: varl,i,j; procedure SPRAWDZ_LITERY_A; var s:integer; { fors:=(i+l)to(i+k-1)do ify[s]!= a then return false; return true; } procedure ZNAJDZ_WSZYSTKIE_WYSZUKANIA { L:=0;I:=1;J:=0; while(i<=n-m+1)do{ if(j=m-k+1)or(x[j+k]!=y[i+j+k-1])then{ if(j=m-k+1)andsprawdz_litery_athen ZNALEZIONO_WZORZEC(I); if(j=0)then{ L:=max(L-1,0); I:=I+1; }elseif(p[j+k-1]<=k-1)then{ L:=P[J+K-1]; I:=I+(J+K-1-P[J+K-1]); J:=0; }else{ L:=K-1; I:=I+(J+K-1-P[J+K-1]);
} } J:=P[J+K-1]-(K-1); } }else J:=J+1; ijużśpieszymygowyjaśnić.zmiennekolejnooznaczaj a: Aktualniestaramysi esprawdzić,czywzorzecwyst epujewtekściepoczynaj acodpozycjiitekstu. Wiemy,żeliteryx[K...K+J 1]si ezgadzaj aztekstemnatejpozycji, tjpierwszychj literpoczynaj acodpozycjikwzorcasi ezgadzaz tekstem. Wiemy,żeliteryx[1...L]si ezgadzaj aztekstemnatejpozycji,tj pierwszychlliterawzorcasi ezgadzaztekstem. Algorytmstarasi eznaleźćwzorzecwtekściepodobniejakalgorytm Morrissa-Pratta,alewpierwsprawdzaj acliteryodpozycjikwzorca(czyli pozycjek,k+1itd.).dopiero,jeśliwszystkiespasuj a,sprawdzapocz atkowe K 1litera,czypasuj a. Funkcja SPRAWDZ LITERY A sprawdza, czy litery a na pozycjach wzorca odl+1dok 1pasuj adotekstu. Tłumacz acdokładniej,algorytmwp etliwykonuje: Jeślijużznaleźliśmywszystkieliterywzorcapozapocz atkowymi literamia(j=m K+1)lubsprawdzamykolejn aliter einiepasuje (x[j+k] y[i+j+k 1])to: Jeśli to jest przypadek, że znaleźliśmy wszystkie litery wzorca od pozycjik,tosprawdzamybrakuj aceliteryaijesłisi ezgadzaj a, wypisujemy,żeznalezionowyst apienie. Niezależnieodtego,czyjestwyst apienie, czy właśnie litera wzorca nie spasowała, musimy wykonać odpowiednik przejścia przez tablic epwalgorytmiemorrissa-pratta.czyli: Jeśli nie było wcześniej żadnego spasowania(j = 0), to przesuwamysi edonast epnejpozycji(i:=i+1).jwci aż zostaje 0,zaśjeśliwcześniejwiedzieliśmy,żepasujenamLlitera napocz atkusłowa,toterazwiemytylkool 1literach przesun eliśmysi eojedenwprawo.
Jeśli było spasowanie, dokonujemy przejścia przez tabliće P jakwalgorytmiemorrissa-pratta,tj.nast epn amożliw apozycj adoszukaniawzorcajestj+k 1 P[J+K 1]. OtyleprzesuwamyI.Zauważyliśmyjuż,żetoprzesuni ecie b edziewynosiłoconajmniejk.wobectegowszystkielitery zpocz atkowychp[j+k 1]naszalgorytmjużsprawdził żepasuj a.jeślip[j+k 1] K 1,czylinaszawiedza obejmujetylkoliterya,zapami etujemyt ewiedz ewzmiennejliustawiamyjna0.jeśliwiemyowi ekszejilościliter, zapami etujemytowl(l:=k 1)iwJ. W przeciwnym przypadku, czyli jeśli nie znaleźliśmy jeszcze całego wzorcapopozycjik,akolejnaliterapasuje,poprostuzwi ekszamy Jojeden. Poprawnośćalgorytmu,czylito,żealgorytmznajdujewszystkiewyst apienia wzorca w tekście, jest oczywista algorytm sprawdza wszystkie możliwe acztablicy wyst apieniawzorcatakjakalgorytmmorrissa-pratta,korzystaj P.Wtymtekścieskupimysi enadowodzie,żetenalgorytmwykonujepesymistycznie nporównańwzorcaztekstem.. Dowód Wdowodziepoprawnościposłużmysi enast epuj ac anomenklatur a:napocz atku mamy nkrólików,zakażdeporównaniewzorcaztekstempłac ejednegokró- lika. Udowodni e,żewkażdymstaniemamprzynajmniej (n I J+1)+1 (K+(K L)+J) K= (n I+1) J 1 L królików.tonapocz atkuwynosi n.wstaniekońcowymn I J+1 K 1,aK+(K L)+J K,czyliliczbakrólikówwynosiconajmniej (K 1)+1 K K=K >0,cobyzakończyłodowód.Wystarczywykazać terazprzezindukcj e,żejeśliprzedkrokiemalgorytmumieliśmyprzynajmniej tyle królików, to po też. Rozpatrzmywi eckolejneprzypadkinaszegoalgorytmu: 1.Wprzypadku,gdyliterawzorcaspasowałanamsi ezliter atekstu, nast apiłojedyniezwi ekszeniejo1.zapłaciliśmyjednegokrólikaza porównanie, ale liczba wymaganych królików spadła o jeden. Czyli wszystkosi ezgadza. 4
.Wprzypadku,gdyliterawzorcaniespasowałasi ezliter a tekstu, ale J=0,wówczaszmieniliśmy:Isi ezwi ekszyłoo1,zaślzmniejszyło o jeden. Zapłaciliśmy jednego królika za porównanie, ale liczba wymaganychkrólikówteżspadłaojeden( zazwi ekszeniei,+1 za zmniejszenie L)..Wprzypadku,gdyliterawzorcaniespasowałasi ezliter a tekstu, ale J>1,wówczass adwapodprzypadki: GdyP[J+K 1] K 1,wówczaszmieniliśmy:J:=0,L:= P[J+K 1],I:=I+J+K 1 P[J+K 1].Policzmyzmian e liczby wymaganych królików: wzwi azkuzezmian aj:+j wzwi azkuzezmian al:+ 1(L P[J+K 1]) wzwi azkuzezmian ai: (J+K 1 P[J+K 1]) różnica wynosi J+ 1 (L P[J+K 1]) (J+K 1 P[J+K 1])= = 1 (J+K 1 P[J+K 1]) 1 (K 1 L) 1 (K 1 P[J+K 1]) 1 (J+K 1 P[J+K 1]), alejakjużzauważyliśmyj+k 1 P[J+K 1] K,to rórńica wynośi co najmniej 1, czyli mamy królika do zapłacenia za porównanie. WprzeciwnymprzypadkumamyL:=K 1,J:=P[J+K 1] K+1iI:=I+J+K 1 P[J+K 1].Policzmyzmian e liczby wymaganych królików: wzwi azkuzezmian aj:+j+k 1 P[J+K 1] wzwi azkuzezmian al: 1((K 1) L) wzwi azkuzezmian ai: (J+K 1 P[J+K 1]) różnicawynosi 1 (K 1 L) 1(J+K 1 P[J+K 1]),wi ec tak jak poprzednio mamy przynajmniej 1 królika na opłacenie tego porównania. 4.Wprzypadku,gdyznaleźliśmywyst apienie wzorca, wykonujemy K 1 Lporównańsprawdzaj ac,czyliteryazgadzaj asi ewtekściez 5
wzorcem,poczymwykonujemyprac etak asam a, jak w poprzednim punkcie. Zauważmy, że w pierwszym przypadku: 1 (J+K 1 P[J+K 1]) 1 (K 1 L) 1 (K 1 P[J+K 1]) Zaś w drugim przypadku: 1 K 1 (K 1 L) (K 1 L) 1 (K 1 L) 1 (J+K 1 P[J+K 1]) 1 (K 1 L) 1 K (K 1 L) Czyli w obu przypadkach wymagana liczba królików spada na tyle, że jesteśmy w stanie zapłacić za porównania. Czylizawszemamywymagan aliczb ekrólików,napocz atku wynosi ona n,nakońcujestnieujemna,czyliwykonujemymaksymalnie nporównań. 6