Поиск подстроки в строке с использованием хеширования. Алгоритм Рабина-Карпа — различия между версиями
Vasin (обсуждение | вклад) (→Метод хеширования) |
Vasin (обсуждение | вклад) (→Алгоритм) |
||
| Строка 15: | Строка 15: | ||
==Алгоритм== | ==Алгоритм== | ||
| − | + | Есть шаблон - <tex>p[1..m]</tex> и строка - <tex>s[1..n]</tex>. Нужно найти все вхождения шаблона в строку. | |
| − | + | В начале вычисляются <tex>hash(s[1..m])</tex> и <tex>hash(p[1..m])</tex>. | |
| − | + | Для <tex>i \in [1..n - m + 1]</tex> вычисляется <tex>hash(s[i..i + m - 1]</tex> и сравниваются с <tex>hash(p[1..m])</tex>. Если они получаются равными - то считается, что подстрока <tex>p</tex> входит в строку <tex>s</tex> (начиная с позиции <tex>i</tex>;) или проверяется, что подстрока является шаблоном, для этого выбираются и сравниваются случайные символы из строк. | |
Следует предподсчитать <tex>p^{m}</tex>. | Следует предподсчитать <tex>p^{m}</tex>. | ||
Версия 22:14, 24 марта 2012
Алгоритм Рабина — Карпа — это алгоритм поиска подстроки в строке, используя хеширование.
Метод хеширования
Следует использовать полиномиальный хеш - mod , где - это некоторое простое число, а - некоторое большое число, чтобы было меньше коллизий (обычно берётся или , чтобы модуль брался автоматически - при переполнении типов;). Стоит обратить внимание, что если 2 строчки имеют одинаковый хэш, то они в большинстве таких случаев равны.
При удалении первого символа строки и добавлении символа в конец считать хеш новой строки при помощи хеша изначальной строки возможно за :
.
.
Получается : .
Алгоритм
Есть шаблон - и строка - . Нужно найти все вхождения шаблона в строку.
В начале вычисляются и .
Для вычисляется и сравниваются с . Если они получаются равными - то считается, что подстрока входит в строку (начиная с позиции ;) или проверяется, что подстрока является шаблоном, для этого выбираются и сравниваются случайные символы из строк.
Следует предподсчитать .
Псевдокод
RabinKarp (string , string ) for to if if return else return
Новый хеш был получен с помощью быстрого пересчёта. Мы считаем, что - пустой символ.
Время работы
Изначальный подсчёт хешей - . В цикле всего итераций - каждая выполняется за . Итого - .
Литература
Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.