Изменения

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

Алгоритм Ландау-Шмидта

280 байт убрано, 21:33, 17 июня 2014
Алгоритм
== Алгоритм ==
Метод нахождения всех тандемных повторой за время <tex>O( n \log n + z)</tex>, где <tex>z</tex> — число всех тандемных повторов в <tex>S</tex>. Метод разработали Ландау и Шмидт.Рещение Ландау-Шмидта — это рекурсивный алгоритм типа "разделяй и властвуй", который основан на возможности вычислять запросы о наибольшем общем продолжении за константное время. Пусть <tex>h = [(n/2])</tex>. В укрупненном масштабе метод Ландау-Шмидта делит задачу нахождения всех тандемных повторов на четыре подзадачи:
# Найти все тандемные повторы, содержащиеся целиком в первой половине <tex>S</tex>( до позиции <tex>h</tex> включительно).# Найти все тандемные повторы, содержащиеся целиком во второй половине <tex>S</tex> ( после позиции <tex>h</tex>).
# Найти все тандемные повторы, в которых первая копия покрывает позицию <tex>h</tex>.
# Найти все тандемные повторы, в которых вторая копия покрывает позицию <tex>h</tex>.
|[[Файл: tandem.png|thumb|400px|center| Любая позиция между <tex>A</tex> и <tex>B</tex> включительно может быть начальной точкой тандемного повтора длины <tex>2l</tex>. Как указывается в шаге 4, длины <tex>l_1</tex> и <tex>l_2</tex> обе положительны, поэтому подынтервал этих начальных точек определяет тандемные повторы, в которых первая копия покрывает <tex>h</tex>.]]
|}
*===Алгоритм для задачи 3===Мы хотим найти все тандемные повторы, у которых первая копия покрывает позицию <tex>h</tex> ( но не обязательно начинается в ней). Идея алгоритма заключается в следующем. Для любого фиксированного <tex>l</tex> можно за константное время проверить, существует ли такой тандемный повтор длины <tex>2l</tex>, у которого первая копия покрывает позицию <tex>h</tex>. Применение этого теста ко всем допустимым значениям <tex>l</tex> означает, что за время <tex>O( n)</tex> мы можем найти все длины таких тандемных повторов. Более того, для каждой такой длины мы можем перечислить начальные точки этих тандемных повторов за время, пропорциональное их числу. Ниже описано, как проверить
число <tex>l</tex>.
# Положить <tex>q:=h + l</tex>.
# Вычислить наибольшее общее продолжение ( в прямом направлении) из позиций <tex>h</tex> и <tex>q</tex>. Пусть <tex>l_1</tex> — длина этого продолжения.# Вычислить наибольшее общее продолжение ( в обратном направлении) из позиций <tex>h - 1</tex> и <tex>q - 1</tex>. Пусть <tex>l_2</tex> — длина этого продолжения.
# Тандемный повтор длины <tex>2l</tex>, первая копия которого покрывает позицию <tex>h</tex>, существует в том и только том случае, если <tex>l_1 + l_2 \geqslant l</tex> и обе длины <tex>l_1</tex> и <tex>l_2</tex> положительны. Более того, если такой тандемный повтор длины <tex>2l</tex> существует, то он может начинаться в любой позиции от <tex>\max ( h - l_2, h — l + 1)</tex> до <tex>\min ( h + l_1 — l, h)</tex> включительно. Вторая копия повтора начинается в <tex>l</tex> позициях вправо. Вывести каждую из этих начальных позиций вместе с длиной <tex>2l</tex>.
=== Корректность ===
 
== Теорема ==
{{Лемма
42
правки

Навигация