У вас вопросы?
У нас ответы:) SamZan.net

Поиск подстроки в строке с помощью хеш-функци

Работа добавлена на сайт samzan.net: 2015-12-26

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 30.6.2025

Поиск подстроки в строке - часто возникающая на практике задача. Поиск подстроки в строке обычной подстановкой к каждой позиции строки всей подстроки - метод неэффективный и вообще грустный. Я рассмотрю метод поиска с помощью хеш-функции - достаточно простой и быстрый.

Каждый символ имеет свой уникальный код от 0 до 255. Суть метода заключается в том, чтобы для подстроки подсчитать некоторую хэш-функцию (например сумму кодов всех символов в строке), затем посчитать ту же самую хэш-функцию для части строки, равной по длине подстроке, и, в случае совпадения хэш-функции, полностью сравнить его. Ускорение работы алгоритма связано с тем, что мы каждый раз не пересчитываем каждый раз хэш-функцию, а только отнимаем значение функции от самого "старого" символа и добавляем значение функции от следующего символа.

Пример:

Алфавит кодов:

Q = 1

W = 2

E = 3

R = 4

T = 5

Y = 6

Подстрока: QWERTY

Строка: QWERYTEWEQWERTY

Считаем хэш-функцию для подстроки: SS = 1+2+3+4+5+6+7 = 28

QWERYTEWEQWERTY

Считаем хэш-функцию для первых 6 символов строки: FS = 1+2+3+4+5+7+6 = 28

Проводим полное сравнение строк - строки не совпадают.

QWERYTEWEQWERTY

FS = 28 - [Q] + [E] = 28 - 1 + 3 = 30 - код не совпадает, сравнение не проводим.

QWERYTEWEQWERTY

FS = 30 - [W] + [W] = 30 - 2 + 2 = 30 - код не совпадает, сравнение не проводим.

QWERYTEWEQWERTY

FS = 30 - [E] + [E] = 30 - 3 + 3 = 30 - код не совпадает, сравнение не проводим.

QWERYTEWEQWERTY

FS = 30 - [R] + [Q] = 30 - 4 + 1 = 27 - код не совпадает, сравнение не проводим.

QWERYTEWEQWERTY

FS = 27 - [Y] + [W] = 27 - 6 + 2 = 23 - код не совпадает, сравнение не проводим.

QWERYTEWEQWERTY

FS = 23 - [T] + [E] = 23 - 5 + 3 = 21 - код не совпадает, сравнение не проводим.

QWERYTEWEQWERTY

FS = 21 - [E] + [R] = 21 - 3 + 4 = 22 - код не совпадает, сравнение не проводим.

QWERYTEWEQWERTY

FS = 22 - [W] + [T] = 22 - 2 + 5 = 25 - код не совпадает, сравнение не проводим.

QWERYTEWEQWERTY

FS = 25 - [E] + [Y] = 25 - 3 + 6 = 28 - код совпадает, полное сравнение совпадает. Ура!

Текст программы:

Program FSISHF; {поиск подстроки в строке}

Const

  NStr = 30000;

  NSub = 3000;

Var

  FStr : array[1..NStr] of char;

  FSub : array[1..NSub] of char; {substring}

  FSum, NSum : longint; {Контрольная сумма}

  Spec, Work : word;

  Flag : boolean;

Begin

  FSum := 0;

  NSum := 0;

  FillChar(FStr, SizeOf(FStr), 0);

  FillChar(FSub, SizeOf(FSub), 0);

  For Spec := 1 to NSub do

    FSum := FSum + Ord(FSub[Spec]);

  For Spec := 1 to NSub do

    NSum := NSum + Ord(FStr[Spec]);

  For Spec := NSub to NStr do begin

    If NSum = FSum then begin

      Flag := true;

      For Work := 1 to NSub do

        If FSub[Work] <> FStr[Spec - NSub + Work] then begin

          Flag := false;

          break;

        end;

      If Flag = true then begin

        Writeln ('substring starts at position: ', Spec - NSub);

        Halt;

      end;

    end;

    NSum := NSum + Ord(FStr[Spec + 1]) - Ord(FStr[Spec - NSub + 1]);

  end;

  Writeln('no such substring');

end.

Список литературы

Для подготовки данной работы были использованы материалы с сайта http://g6prog.narod.ru/




1. I Otherwise they will be killed in the ner future These bers s well s eight other ones were rescued by mrried couple Ivn Leschenko nd Ljubov Leschenko living in Primorsky Kry Russin Fr Es
2. Экономика 1 Микроэкономика
3. После Сергеев ГеоргийНа улице по обычаю стояла говеная погода мне не хотелось делать чт
4. Ах как поесть хочется доносится иногда из недр нашего желудка
5. Через почву осуществляются биогеохимические циклы практически всех элементов углерода азота фосфора
6. то мы это осознали
7. Принципы проведения аудита
8. Дипломная работа- Разработка плана деятельности торгового предприятия
9. тема Выполнил студент- Мои
10. х спицах. Опять же только принцип.