Изменения

Перейти к: навигация, поиск

Алгоритм Ландау-Вишкина (k несовпадений)

966 байт добавлено, 14:26, 15 июня 2014
Нет описания правки
Дано число <tex>k > 0</tex> текст <tex>y[1...n]</tex> и образец <tex>x[1...m]</tex>, <tex>m < n</tex>. Требуется найти все подстроки текста длины <tex>m</tex>, с не более чем <tex>k</tex> несовпадающими символами.
==Основная идеяАлгоритм==
При анализе текста используется двумерный массив <tex>tm[0...n-m][1...k+1]</tex>, содержащий информацию о несовпадениях текста с образцом. По завершении анализа в его <tex>i</tex>-й строке содержатся позиции в <tex>x</tex> первых <tex>k+1</tex> несовпадений между строками <tex>x[1...m]</tex> и <tex>y[i+1...i+m]</tex>. Таким образом, если <tex>tm[i][v] = s</tex>, то <tex>y[i+s] \neq x[s]</tex>, и это <tex>v</tex>-е несовпадение между <tex>x[1...m]</tex> и <tex>y[i+1...i+m]</tex>, считая слева направо. Если число <tex>d</tex> несовпадений <tex>x[1...m]</tex> с подстрокой <tex>y[i+1...i+m]</tex> меньше <tex>k+1</tex>, то, начиная с <tex>d+1</tex>, элементы <tex>i</tex>-й строки равны значению по умолчанию <tex>m+1</tex>.
[[Файл:algLandauVishkin1.png|thumb|380px|right|..В таблицу tm по номеру несовпадения записывается соответстующий индекс образца.]]
Заметим, если <tex>tm[i][k+1] = m+1</tex>, то подстрока <tex>y[i+1...i+m]</tex> отличается от образца <tex>x</tex> не более, чем на <tex>k</tex> символов, и, таким образом, является решением задачи.
==Пример==
Пусть <tex>x = "tram"</tex>, <tex>y = "thetrippedtrap"</tex>, <tex>k = 2</tex>.
//todo {| class="wikitable" cellpadding="4" border="1" style="border-collapse: collapse; text-align: center;"|-| tm|| '''1''' || '''2''' || '''3''' || x[1..m] || y[i+1..i+m]|-| '''0''' || 2 || 3 || 4 || '''t'''ram || '''t'''het|-| '''1''' || 1 || 2 || 3 || tram || hetr|-| '''2''' || 1 || 2 || 3 || tram || etri|-| '''3''' || 3 || 4 || style="background:#FFCC00"| 5 || '''tr'''am || '''tr'''ip|-| '''4''' || 1 || 2 || 3 || tram || ripp|-| '''5''' || 1 || 2 || 3 || tram || ippe|-| '''6''' || 1 || 2 || 3 || tram || pped|-| '''7''' || 1 || 2 || 3 || tram || pedt|-| '''8''' || 1 || 2 || 3 || tram || edtr|-| '''9''' || 1 || 2 || 3 || tram || dtra|-| '''10''' || 4 || style="background:#FFCC00"| 5 || style="background:#FFCC00"| 5 || '''tra'''m || '''tra'''p|}
//todo pm
297
правок

Навигация