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