Доклад

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

Работа добавлена на сайт bukvasha.net: 2015-06-29

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

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

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

от 25%

Подписываем

договор

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

Скидка 25% при заказе до 25.2.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.


1. Курсовая Шляхи вдосконалення кредитних відносин НБУ з комерційними банками
2. Реферат на тему International Tensions Between 1871 1914 Essay Research
3. Реферат Прикладная фотохимия
4. Реферат на тему Australia And Asia Essay Research Paper This
5. Реферат Инфляция природа, изменение, социально экономические последствия
6. Реферат Бюджетная система в РФ
7. Реферат Идеи правового государства и его основные признаки
8. Реферат Система управления сепаратором на промысловой компрессорной станции
9. Сочинение Рецензия по произведению А.И. Солженицын Гроза в горах
10. Курсовая на тему Воздействие стресса на человека