ALG!5

ALG!5



8.2. Nowe algorytmy poszukiwań 215

l

int i=-1 ; start:

i++;

etO:

if (t: i]! = i + + ;

' a •)

goto

start;

et 1:

if (t [ i ] ! =1 i++;

'n'!

goto

RtO;

ptż:

if (tli)!=’ it+;

'a')

goto

etO;

et3:

if <t[i]!=1 i++;

'n')

goto

eti;

if (tli|!=' i+ + ;

'a')

goto

et2;

if (t[i]!=1

’s’)

goto

et3;

i+x;

return i-6; )

W celu właściwego odtworzenia etykiet należy oczywiście co najmniej raz wykonać funkcję iniljshifts lub obliczyć samemu odpowiednie wartości. W każdym razie gra jest warta świeczki: powyższa funkcja charakteryzuje się bardzo zwięzłym kodem wynikowym asemblerowym, jest zatem bardzo szybka. Posiadacze kompilatorów, które umożliwiają generację kodu wynikowego jako tzw. „assembly output"1 mogą z łatwością sprawdzić różnice pomiędzy wersjami kmp i kmp_ancmas\ Dla przykładu mogę podać, że w przypadku wspomnianego kompilatora GNU „klasyczna" wersja procedury kmp (wraz z initjshifts) miała objętość około 170 linii kodu asemblerowego, natomiast kmp ananas zmieściła się w ok. 100 liniach... (Patrz pliki z rozszerzeniem s na dyskietce).

Algorytm K-M-P działa w czasie proporcjonalnym do M+N w najgorszym przypadku. Największy zauważalny zysk związany z jego użyciem dotyczy przypadku tekstów o wysokim stopniu samopowtarzalności - dość rzadko występujących w praktyce. Dla typowych tekstów zysk związany z wyborem metody K-M-P będzie zatem słabo zauważalny.

Użycie tego algorytmu jest jednak niezbędne w tych aplikacjach, w których następuje liniowa przeglądanie tekstu - bez buforowania. Jak łatwo zauważyć, wskaźnik i w funkcji kmp nigdy nie jest dekrementowany, co oznacza, że plik można przeglądać od początku do końca bez cofania się w nim. W niektórych systemach może to mieć istotne znaczenie praktyczne przykładowo mamy zamiar analizować bardzo długi plik tekstowy i charakter wykonywanych operacji nie pozwala na cofnięcie się w tej czynności (i w odczytywanym na bieżąco pliku).

4 W przypadku kompilatorów popularnej serii Turbo C-H /Borland C++ należy skompilować program „ręcznie" poprzez polecenie lec -S -lxxx plik.cpp, gdzie .v.v.r oznacza katalog z plikami typu li; identyczna opcja istnieje w kompilatorze GNU c++, należy „wystukać”: c++ -Splik.cpp.


Wyszukiwarka

Podobne podstrony:
ALG!3 8.2. Nowe algorytmy poszukiwań 213 Analogiczny przykład znajduje się na rysunku 8-5. 8.2. Nowe
ALG!9 8,2. Nowe algorytmy poszukiwań 219 słowa wejściowego o długości M wydaje się tak samo kosztown
ALG 1 8.2. Nowe algorytmy poszukiwań 221 Kolejne uwagi należą się parametrom p i b. Zaleca się, aby
ALG!7 3.2. Nowe algorytmy poszukiwań 217 Algorytm jest jak widać klarowny, prosty i szybki. Jego rea
ALG!1 82. Nowe algorytmy poszukiwań 211 dodatek jest to algorytm łatwo dający się generalizować na p
Programowanie równoległeSuma elementów tablicy a[n] n procesorów Algorytm poszukiwania minimum i alg
Egzamin Algorytmy Zadanie ■for (int i-0; i<n; i-*-*-) ( i* <i%3--0) A[i]-l; // (-) i* (i%6--0)
11813 Maśliński4984 gicznc mechanizmów przerzutowania wytyczyły nowe kierunki poszukiwania metod ich
WSP J POLM107 Nowe funkcje gwary 215 czy rybaków, którzy tworzą słownik odpowiedni do swoich specyfi
Mnie jednak o wiele bardziej podobają się algorytmy na parzenie herbaty;) Start + NIE Czy woda
16 Wstęp wykonuje pewien proces (algorytm) poszukiwania tego słowa (świadomie — gdyż bez udziału
ALG3 5.1 Listy jednokierunkowe 113 int wzor(int x,int(*fun)(int!) [ return fun(x); ) void main(} i
ALG 3 10.4. Algorytm Roy-Warshalla 253 Algorytm Roy-Warshalla może być w dość prosty sposób zmodyfik
ALG 5 10.5. Algorytm Floyda 255 •    W/iJ]~wartość przypisana krawędzi lub00 (inaczej

więcej podobnych podstron