Поиск наибольшей общей подстроки двух строк с использованием хеширования — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «==Постановка задачи== Имеются строки <tex>S</tex> и <tex>T</tex> такие, что элементы этих строк <tex>-</tex> …»)
(нет различий)

Версия 08:13, 15 марта 2011

Постановка задачи

Имеются строки [math]S[/math] и [math]T[/math] такие, что элементы этих строк [math]-[/math] символы из конечного алфавита [math] \sum [/math]. Говорят, что строка [math]Z[/math][1 .. m] является подстрокой строки [math]S[/math][1 .. n], если существует такой индекс [math]k[/math] ∈ [1 .. n - m], что для любого [math]i[/math] ∈ [1 .. m] справедливо [math]S[k + i] = Z[i][/math]. Требуется найти такую строку [math]Z[/math], максимальной длины, что [math]Z[/math] является и подстрокой [math]S[/math], и подстрокой [math]T[/math].

Алгоритм

Данный алгоритм основывается на методе половинного деления. Пусть длина наибольшей общей подстроки будет [math]x[/math]. Заметим, что у строк [math]S[/math] и [math]T[/math] обязательно найдется общая подстрока длины [math]y[/math] ∈ [0 .. [math]x[/math]], так как в качестве такой строки можно взять префикс наибольшей общей подстроки. Рассмотрим функцию [math]f[/math] : [1 .. min(len([math]S[/math]), len([math]T[/math]))] → [math]\mathbb{Z}[/math], которая для [math]i[/math] из области определения равна [math]i[/math], если у строк [math]S[/math] и [math]T[/math] есть общая подстрока длины [math]i[/math], иначе она равна 0. Согласно замечанию, функция [math]f[/math] должна по мере возрастания [math]i[/math] строго монотонно возрастать до некоторого момента, а затем обращаться в 0. Таким образом на области определения у функции [math]f[/math] достигается максимум. Собственно, этот максимум и является длиной наибольшей общей подстроки у строк [math]S[/math] и [math]T[/math], так как функция [math]f[/math] специально так определена. Таким образом требуется с помощью бинарного поиска найти максимум функции [math]f[/math] на ее множестве определения.