Поиск наибольшей общей подстроки двух строк с использованием хеширования — различия между версиями
(→Псевдокод) |
(→Псевдокод) |
||
Строка 14: | Строка 14: | ||
<tex>f</tex> — функция, описанная в алгоритме. | <tex>f</tex> — функция, описанная в алгоритме. | ||
− | + | <tex>i</tex> - длина подстроки, найденная с помощью [[Целочисленный двоичный поиск|двоичного поиска]]. | |
+ | |||
<tex>f(i)</tex> | <tex>f(i)</tex> | ||
Записываем в <tex>S</tex> хэши подстрок строки <tex>s</tex> длины <tex>i</tex>; | Записываем в <tex>S</tex> хэши подстрок строки <tex>s</tex> длины <tex>i</tex>; |
Версия 16:39, 12 сентября 2012
Постановка задачи
Имеются строки
и такие, что элементы этих строк символы из конечного алфавита . Говорят, что строка является подстрокой строки , если существует такой индекс , что для любого справедливо . Требуется найти такую строку максимальной длины, что является и подстрокой , и подстрокой .Алгоритм
Пусть длина наибольшей общей подстроки будет двоичного поиска найти это значение. В ходе работы придется проверять наличие общей подстроки заданной длины. Для этого будем использовать хеширование, чтобы улучшить асимптотику алгоритма. Алгоритм является эвристическим и может выдавать неверный ответ, так как совпадение хешей строк не гарантирует равенство строк. Поэтому нужно выполнить проверку нескольких случайных символов подстрок на совпадение, проиграв при этом по времени работы. Алгоритм работает следующим образом:
. Заметим, что у строк и обязательно найдется общая подстрока длины , так как в качестве такой строки можно взять префикс наибольшей общей подстроки. Рассмотрим функцию , которая для из области определения равна 1, если у строк и есть общая подстрока длины , иначе она равна 0. Согласно замечанию, функция должна по мере возрастания быть равной 1 до некоторого момента, а затем обращаться в 0. Собственно, максимальное значение, при котором функция принимает значение 1, является длиной наибольшей общей подстроки. Таким образом, требуется с помощью1) У строки
хешируем подстроки заданной длины и полученные хеши записываем в Set.2) У строки
хешируем подстроки заданной длины и в случае совпадения хеша с элементом Set проверяем несколько случайных символов подстрок на совпадение.Хеширование будем производить так же, как и в алгоритме Рабина-Карпа.
Псевдокод
— функция, описанная в алгоритме. - длина подстроки, найденная с помощьюЗаписываем в хэши подстрок строки длины ; for Считаем хэш от подстоки ; if хэш содержится в if совпали несколько случайных символов подсток return 1; else continue; return 0;
Время работы
Проведем оценку асимптотики времени работы предложенного алгоритма. Посмотрим сколько нам потребуется действий на каждом шаге бинарного поиска. Во-первых, хеширование подстрок строки
и запись их в Set требует шагов. Во-вторых, хеширование подстрок строки и проверка их наличия в Set требует . Проверка на совпадение нескольких символов подстрок требует константное время. Значит,на каждый шаг бинарного поиска требуется действий. Заметим, что всего для завершения бинарного поиска потребуется шагов. Следовательно, суммарное время работы алгоритма будет действий.Литература
- Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.