Курсовая работа: Алгоритмы поиска подстроки в строке

Res:=TRUE;

Place:=i

end

else i:=i+1;

Search:=Res

End;

Очень просто, но очень неразумно. Ведь максимальное, количество сравнений будет равно O((m-n+1)*n+1), хотя большинство из них на самом деле лишние. Например, найдя строку aabc и обнаружив несоответствие в четвертом символе (совпало только aab), алгоритм будет продолжать сравнивать строку, начиная со следующего символа, хотя это однозначно не приведет к результату.

Следующий метод работает намного быстрее простейшего, но, к сожалению, накладывает некоторые ограничения на текст и искомую строку.

1.2.2. Алгоритм Рабина.

Алгоритм Рабина представляет собой модификацию линейного алгоритма; он основан на весьма простой идее, которую изложим, следуя книге [13 ,172-173].

«Представим себе, что в слове A, длина которого равна m, мы ищем образец X длины n. Вырежем "окошечко" размером n и будем двигать его по входному слову. Нас интересует, не совпадает ли слово в "окошечке" с заданным образцом. Сравнивать по буквам долго. Вместо этого фиксируем некоторую числовую функцию на словах длины n, тогда задача сведется к сравнению чисел, что, несомненно, быстрее. Если значения этой функции на слове в "окошечке" и на образце различны, то совпадения нет. Только если значения одинаковы, необходимо проверять последовательно совпадение по буквам.» (Листинг 2)

Листинг 2

Function Search (S: String; X: String; var Place: Byte): Boolean;

{ Функция возвращает результат поиска в слове S }

{ подслова X. Place - место первого вхождения }

Var Res: Boolean; i: Byte; h,NowH,LenX:Integer; HowMany:Integer;

Begin

Res:=FALSE;

i:=1;

h:=Hash(x); {Вычисление хеш-функции для искомого слова}

NowH:=Hash(Copy(S,1,Length(x)));

HowMany:=Length(S)-Length(X)+1;

LenX:=Length(X);

While (i<=HowMany) And Not(Res) do

If (h=NowH) and (Copy(S,i,Length(X))=X) then

Begin

Res:=TRUE;

Place:=i

End

else

Begin

К-во Просмотров: 490
Бесплатно скачать Курсовая работа: Алгоритмы поиска подстроки в строке