Алгоритм нахождения тандемных повторов — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(добавилась картинка)
(Перенаправление на Алгоритм Ландау-Шмидта)
 
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
== Определения ==
+
#перенаправление [[Алгоритм Ландау-Шмидта]]
{{Определение
 
|definition='''Тандемные ряды.''' (англ. ''tandem array'') {{---}} Подстрока <tex>\alpha</tex>, содержащаяся в строке <tex> \mathrm{S} </tex>, называется тандемным рядом строки <tex>\beta</tex> (называемой основой), если а состоит из более чем одной последовательной копии <tex>\beta</tex>.
 
}}
 
{{Определение
 
|definition='''Тандемный повтор''' <tex>\alpha</tex> — это строка, которая может быть записана как <tex>\beta\beta</tex>, где <tex>\beta</tex> — подстрока.
 
}}
 
Каждый тандемный повтор задается начальной позицией повтора и длиной подстроки <tex>\beta</tex>. Это определение не требует, чтобы <tex>\beta</tex> была максимальной длины. Например,в строке <tex>xababababy</tex> есть шесть тандемных повторов. Два из них начинаются в позиции два: <tex>abab</tex> и <tex>abababab</tex>. В первом случае <tex>\beta = ab</tex>, а во втором <tex>\beta = abab</tex>.
 
{{Определение
 
|definition='''Тандемным повтором точности  <tex>k</tex>''' называется подстрока, которая становится тандемным повтором после изменения не более <tex>k</tex> символов.
 
}}
 
Например, <tex>axabaybb</tex> — тандемный повтор точности 2.
 
 
 
== Алгоритм ==
 
Метод нахождения всех тандемных повторой за время <tex>O(n \log n + z)</tex>, где <tex>z</tex> — полное число тандемных повторов в <tex>\mathrm{S}</tex>. Метод разработали Ландау и Шмидт.
 
Рещение Ландау-Шмидта — это рекурсивный алгоритм типа "разделяй и властвуй", который основан на возможности вычислять запросы о наибольшем общем продолжении за константное время. Пусть <tex>h = [n/2]</tex>. В укрупненном масштабе метод Ландау-Шмидта делит задачу нахождения всех тандемных повторов на четыре подзадачи:
 
 
 
# Найти все тандемные повторы, содержащиеся целиком в первой половине <tex>\mathrm{S}</tex>(до позиции <tex>h</tex> включительно).
 
# Найти все тандемные повторы, содержащиеся целиком во второй половине <tex>\mathrm{S}</tex> (после позиции <tex>h</tex>).
 
# Найти все тандемные повторы, в которых первая копия покрывает позицию <tex>h</tex>.
 
# Найти все тандемные повторы, в которых вторая копия покрывает позицию <tex>h</tex>.
 
 
 
Ясно, что никакой тандемный повтор не может встретиться больше чем в одной из этих подзадач. Первые две подзадачи решаются рекурсивно применением того же алгоритма Ландау-Шмидта. Две последние подзадачи симметричны, поэтому мы рассмотрим только третью подзадачу, и алгоритм для нее определит весь алгоритм.
 
 
 
'''Алгоритм для задачи 3'''
 
Мы хотим найти все тандемные повторы, у которых первая копия покрывает позицию h (но не обязательно начинается в ней). Идея алгоритма заключается в следующем. Для любого фиксированного <tex>l</tex> можно за константное время проверить, существует ли такой тандемный повтор длины <tex>2l</tex>, у которого первая копия покрывает позицию <tex>h</tex>. Применение этого теста ко всем допустимым значениям <tex>l</tex> означает, что за время О(п) мы можем найти все длины таких тандемных повторов. Более того, для каждой такой длины мы можем перечислить начальные точки этих тандемных повторов за время, пропорциональное их числу. Ниже описано, как проверить
 
число <tex>l</tex>.
 
  begin
 
  Положить <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>.
 
  end.
 
 
 
[[Файл:tandem.png|Рис. 1. Схематичная иллюстрация к алгоритму для задачи 3.|800px]]
 
///////////////картинка
 
 
 
Любая позиция между <tex>A</tex> и <tex>B</tex> включительно может быть начальной точкой тандемного повтора длины <tex>2l</tex>. Как указывается в шаге 4, длины <tex>l_1</tex> и <tex>l_2</tex> обе положительны, поэтому подынтервал этих начальных точек определяет тандемные повторы, в которых первая копия покрывает <tex>h</tex>.
 
 
 
== Теорема ==
 
{{Лемма
 
|statement = Приведенный метод корректно решает подзадачу 3 для фиксированного <tex>h</tex> Это значит, что он находит все тандемные повторы, у которых первая копия покрывает позицию <tex>h</tex>. Для фиксированного <tex>h</tex> его время работы равно <tex>O(n/2) + z_h</tex>, где <tex>z_h</tex> — число таких тандемных повторов.
 
|proof =
 
Предположим сначала, что имеется тандемный повтор, у которого первая копия покрывает позицию h, и его длина равна, скажем, <tex>2l</tex>. Это означает, что позиция <tex>q = h + l</tex> во второй копии соответствует позиции <tex>h</tex> в первойx копии. Следовательно, для того чтобы обеспечить совпадение суффиксов в этих копиях, некоторая подстрока, начинающаяся в <tex>h</tex>, должна совпадать с подстрокой, начинающейся в <tex>q</tex>. Такая подстрока может иметь длину не более <tex>l_1</tex>. Аналогично, должна быть подстрока, кончающаяся в <tex>h - 1</tex>, которая совпадает с подстрокой, кончающейся в <tex>q-1</tex>, для того чтобы обеспечить совпадение префиксов. Длина этой подстроки не должна превосходить <tex>l_2</tex>. Так как все символы между <tex>h</tex> и <tex>q</tex> содержатся в одной из двух копий, то <tex>l_1 + l_2 \geqslant l</tex>. Обратно, рассуждая в основном так же, если <tex> l_1 + l_2 \leqslant l </tex> и <tex>l_1</tex> и <tex>l_2</tex> положительны, то можно найти тандемный повтор длины <tex>2l</tex>, у которого первая копия покрывает <tex>h</tex>. Необходимое и достаточное условие существования такого тандема теперь доказано.
 
 
 
Обратное доказательство, что все начальные позиции попадают в названный диапазон, аналогично доказывается.
 
Для подсчета времени сначала отметим, что при фиксированном <tex>h</tex> методу нужно константное время на один выбор <tex>l</tex> для того, чтобы выполнить общие запросы о продолжении, и, таким образом, время <tex>O(n/2)</tex> на все такие запросы. Для любого фиксированного <tex>l</tex> методу нужно константное время на обнаруживаемый тандем, и никакой тандем не обнаруживается дважды, так как у всех обнаруживаемых тандемов длины <tex>2l</tex> стартовые точки различны. Поскольку сообщение о каждом повторе состоит из начальной точки и длины, то алгоритм никогда не сообщает о тандемном повторе дважды. Следовательно, время, расходуемое на вывод информации о тандемных повторах, пропорционально <tex>z_h</tex> — числу повторов, у которых первая копия покрывает позицию <tex>h</tex>.}}
 
{{Теорема
 
|statement = Каждый тандемный повтор в <tex>\mathrm{S}</tex> находится решением подзадач 1-4 и при этом только единожды. Время работы алгоритма равно <tex>O(n \log n + z)</tex>, где <tex>z</tex> — полное число тандемных повторов в <tex>S</tex>.
 
|proof=
 
То, что алгоритм находит все тандемные повторы, прямо следует из факта, что каждый тандем имеет форму, предусмотренную одной из подзадач 1 —4. Чтобы показать, что никакой тандемный повтор не выводится дважды, вспомним, что для <tex>h = n/2</tex> никакой из тандемов не принимает формы, предусмотренной более чем одной из четырех подзадач. Рекурсивно это выполняется для подзадач 1 и 2. Далее, при доказательстве Леммы  мы установили, что решение подзадачи 3(а также 4) никогда не получает один и тот же тандем дважды. Следовательно, при полном решении четырех подзадач никакой тандемный повтор не выводится дважды. Отсюда следует, что время вывода всех тандемных повторов равно <tex>O(z)</tex>. Чтобы завершить анализ, рассмотрим время, расходуемое на запросы о продолжении. Это время пропорционально числу выполняемых запросов. Пусть <tex>T(n)</tex> — число запросов при длине строки <tex>n</tex>. Тогда <tex>T(n) = 2T(n/2) + 2n</tex> и <tex>T(n) = O(n \log n)</tex>, как и утверждалось.}}
 

Текущая версия на 20:16, 17 июня 2014

Перенаправление на: