Поиск наибольшей общей подстроки двух строк с использованием хеширования
Версия от 08:13, 15 марта 2011; 192.168.0.2 (обсуждение) (Новая страница: «==Постановка задачи== Имеются строки <tex>S</tex> и <tex>T</tex> такие, что элементы этих строк <tex>-</tex> …»)
Постановка задачи
Имеются строки
и такие, что элементы этих строк символы из конечного алфавита . Говорят, что строка [1 .. m] является подстрокой строки [1 .. n], если существует такой индекс ∈ [1 .. n - m], что для любого ∈ [1 .. m] справедливо . Требуется найти такую строку , максимальной длины, что является и подстрокой , и подстрокой .Алгоритм
Данный алгоритм основывается на методе половинного деления. Пусть длина наибольшей общей подстроки будет
. Заметим, что у строк и обязательно найдется общая подстрока длины ∈ [0 .. ], так как в качестве такой строки можно взять префикс наибольшей общей подстроки. Рассмотрим функцию : [1 .. min(len( ), len( ))] → , которая для из области определения равна , если у строк и есть общая подстрока длины , иначе она равна 0. Согласно замечанию, функция должна по мере возрастания строго монотонно возрастать до некоторого момента, а затем обращаться в 0. Таким образом на области определения у функции достигается максимум. Собственно, этот максимум и является длиной наибольшей общей подстроки у строк и , так как функция специально так определена. Таким образом требуется с помощью бинарного поиска найти максимум функции на ее множестве определения.