ALG"0

ALG"0



220 Rozdział 8. Przeszukiwanie tekstwI iLi

kowej i przenosząc otrzymaną wartość do następnego wyrażenia cząstkowej Dla przykładu weźmy obliczenie:

(5*100 + 6*10 + 8)%7 = 568%7 = 1.

Wynik ten jest oczywiście prawdziwy, co można łatwo sprawdzić z kalkulalc* | rem. Identyczny rezultat da nam jednak następująca sekwencja obliczeń:

1

(0 + 8)%7 = 1


5*100%7 = 3    (3 + 6*10)%7 = 0

... co też jest łatwe do weryfikacji.

Implementacja algorytmu jest prosta, lecz zawiera kilka instrukcji wartych omówienia. Popatrzmy na listing:

rk.cpp

int rk(char w[],char t[] ;

(

unsigned long i,bM_l=l,Hw=0,Ht=0,M.N;

M=strlen (w) , N-strien <t) ;

for (i=0; KM; i++)

I

Hw=(Hw*b+indeks(w[i]))%pi //inicjacja funkcji H dla wzorca

Ht=(Ht‘b+indeks(t[i]|)%o; //inicjacja funkcji H dla tekstu

)

for i i=l;i<M;i++) bM_l= ;b*bM_l)%p;

for(i=0;Hw!=Ht;i++)    // przesuwanie się w tekście

<

Ht= (Ht-Łb*p-indeks (t [i) ) *bM_l) $p; // (*)

Ht=(Ht*b+indeksIt[i+M|))%p; if (i>N—M)

return -1;    // porażka poszukiwał!

>

return i;

}

W pierwszym etapie następuje wyliczenie początkowych wartości H, i Ponieważ ciągi znaków trzeba interpretować jako liczby, konieczne będzie zastosowanie znanej już nam doskonale funkcji indeks (patrz str. 217). Wartość Hw jest niezmienna i nie wymaga uaktualniania. Nic dotyczy to jednak aktualnie badanego fragmentu tekstu - tutaj wartość H, ulega zmianie podczas każdej inkremen-tacji zmiennej i. Do obliczenia H(x) możemy wykorzystać omówioną wcześniej własność funkcji modliło - co jest dokonywane w trzeciej pętli for. Dodatkowego wyjaśnienia wymaga być może linia oznaczona (*). Otóż dodawanie wartości b*p do //, pozwala nam uniknąć przypadkowego „wskoczenia” w liczby ujemne. Gdyby istotnie tak się stało, przeniesiona do następnego wyrażenia arytmetycznego wartość modulo byłaby nieprawidłowa i sfałszowałaby końcowy wynik!


Wyszukiwarka

Podobne podstrony:
ALG!2 212 Rozdział 8. Przeszukiwanie teksfe Rys. 8 - 3. 1 Wyszukiwanie tekst przebadany tekst do
ALG 8 8.‘ 208 Rozdział 8. Przeszukiwanie tekstów Rys. H - 1. Algorytm typu
ALG!4 214 Rozdział 8. Przeszukiwanie tekstdw inicjacji tej tablicy. Funkcja inicjująca tablicę jest
ALG!6 216 Rozdział 8. Przeszukiwanie tekslói8.2.2.Algorytm Boyera i Moore’a Kolejny algorytm, który
ALG!8 218 Rozdział 8. Przeszukiwanie tekstów for(i—M 1,j —M-l; j>0; i — , j—) while(t[i]!=włj)) (
ALG!0 210 Rozdział 8. Przeszukiwanie tekstów Zaprezentowany w tym paragrafie algorytm wykorzystuje k
ALG 6 276__Rozdziału. Algorytmy numeryczne double simpson_f(double i *f) (double),//wskaźnik do f(x)
ALG9 Rozdział 7Algorytmy przeszukiwania Pojęcie „przeszukiwania” pojawiało się w tej książce już ki
ALG6 Rozdział 7. Algorytmy przeszukiwania r > dzielenie modulo RmM: H(v) = v% Rmax Przykład: Dla
ALG 0 200 Rozdział 7. Algorytmy przeszukiwania Rekordy E i F zostały zapamiętane w momencie stwierdz
ALG 2 202 Rozdział 7. Algorytmy przeszukiwani! gdzie a jest współczynnikiem zapełnienia tablicy T. A
ALG 4 204 Rozdział 7. Algorytmy przeszukiwania i (gdzie a jest, tak jak poprzednio, współczynnikiem
ALG 8 258 Rozdział 10. Elementy algorytmiki grafa 1 Rys. 10- 10. Przeszukiwanie grafu „ w głąb Listu
ALG&0 260 Rozdział 10. Elementy algorytmiki grafów przebadane podczas przeszukiwania. Dopiero potem
skanuj0031 (76) 220 Rozdział 6. Język i mass media: znaczące płaszczyzny komunikacji nie (Hass 1998)

więcej podobnych podstron