Алгоритм Ландау-Вишкина (k несовпадений) — различия между версиями
Margarita (обсуждение | вклад) (→Основная идея) |
Margarita (обсуждение | вклад) |
||
Строка 34: | Строка 34: | ||
==Пример== | ==Пример== | ||
Пусть <tex>x = "tram"</tex>, <tex>y = "thetrippedtrap"</tex>, <tex>k = 2</tex>. | Пусть <tex>x = "tram"</tex>, <tex>y = "thetrippedtrap"</tex>, <tex>k = 2</tex>. | ||
− | + | //todo tm | |
//todo pm | //todo pm |
Версия 13:06, 15 июня 2014
Постановка задачи
Дано число
текст и образец , . Требуется найти все подстроки текста длины , с не более чем несовпадающими символами.Основная идея
При анализе текста используется двумерный массив
, содержащий информацию о несовпадениях текста с образцом. По завершении анализа в его -й строке содержатся позиции в первых несовпадений между строками и . Таким образом, если , то , и это -е несовпадение между и , считая слева направо. Если число несовпадений с подстрокой меньше , то, начиная с , элементы -й строки равны значению по умолчанию .//todo (рис 1)
Заметим, если
, то подстрока отличается от образца не более, чем на символов, и, таким образом, является решением задачи.
Затем образец сканируется параллельно с текстом слева на права по одному символу за раз. На итерации
с образцом сравнивается подстрока . - обозначим самую правую позицию в тексте, достигнутую за предыдущие итерации, то есть является максимальным из чисел , где //todo. Если , в присваивается результат работы , которая находит количество несовпадений между и . Если не превышает , вызывается процедура , которая сравнивает подстроки и . Переменная будет рассмотренна ниже.
tm[0...n-m][1...k+1] = m+1 // инициализация r = 0 j = 0 for i = 0 to n - m b = 0 if i < j b = merge(i, r, j) if b < k + 1 r = i extend(i, j, b)
|
и в случае несовпадения
увеличивается и таблица текстовых несовпадений обновляется. Если найдено несовпадений, обработка заканчивается, иначе найдено вхождение образца в подстроке .Пример
Пусть
, , . //todo tm //todo pm