Участница:Mariashka — различия между версиями
Mariashka (обсуждение | вклад) |
Mariashka (обсуждение | вклад) |
||
Строка 29: | Строка 29: | ||
|id=kindscount | |id=kindscount | ||
|statement=<math>2p -RS[p] \leq i \leq p - RP[p + 1]</math> | |statement=<math>2p -RS[p] \leq i \leq p - RP[p + 1]</math> | ||
− | |proof= TODO | + | |proof= Пусть i - индекс конца повтора в строке v, тогда b = 2p - i - длина части повтора принадлежащей u. |
+ | Пусть наш повтор <math>\alpha\alpha</math>, тогда | ||
+ | <math>\alpha = u[(u.len - b + 1) .. (u.len)] + v[1 .. (i - p)] = v[(i - p + 1) .. i] </math> | ||
+ | |||
+ | TODO | ||
}} | }} | ||
Строка 50: | Строка 54: | ||
=== Результат === | === Результат === | ||
− | # Рекурсивно | + | # Делим строку пополам |
− | # Вычислим LP, LS, RP, RS для t с помощью z-функции: <tex> O( | + | # Рекурсивно запускаемся от полученных строк |
− | # Найдем правые и левые повторы, как изложено выше: <tex> O( | + | # Вычислим LP, LS, RP, RS для t с помощью z-функции: <tex> O(t) </tex> |
+ | # Найдем правые и левые повторы, как изложено выше: <tex> O(t) </tex> | ||
== Асимптотика == | == Асимптотика == |
Версия 00:09, 27 апреля 2015
Определение: |
Повтором (англ. repeatition) называется непустая строка вида |
Алгоритм Мейна-Лоренца (англ. Main-Lorentz algorithm) — алгоритм на строках, позволяющий найти все повторы в строке
заСодержание
Алгоритм
Данный алгоритм — это алгоритм "разделяй и властвуй":
- Разделим строку пополам
- Заметим, что повторы делятся на две группы: пересекающие и не пересекающие границу раздела
- Рекурсивно запустимся от каждой половинки — так мы найдем повторы, которые не пересекают границу раздела
- Нахождение повторов, которые пересекают границу раздела
Повторы, пересекающие границу раздела, можно разделить на две группы по положению центра повтора.
Так как повторов строке
, мы не можем хранить их в явном виде. Будем хранить повторы блоками вида , где — это длина повтора, а — промежуток индексов, в которых заканчиваются повторы такой длины.Нахождение правых повтров
Рассмотрим строку
, пусть начало в исходной строке —- Предподсчитаем следующие массивы:
- , где — наибольший общий префикс
- , где — наибольший общий суффикс
- Переберем длину повтора . Для каждого получим интервал индексов конца повтора в строке : .
- Добавим к ответу, учитывая смещение в исходной строке :
Докажем следующее утверждение для нахождения интервала
:Утверждение: |
Пусть i - индекс конца повтора в строке v, тогда b = 2p - i - длина части повтора принадлежащей u. Пусть наш повтор TODO , тогда |
Нахождение левых повтров
Рассмотрим строку
, пусть начало в исходной строке —- Предподсчитаем следующие массивы:
- , где — наибольший общий префикс
- , где — наибольший общий суффикс
- Переберем длину повтора . Для каждого получим интервал индексов конца повтора в строке : .
- Добавим к ответу, учитывая смещение в исходной строке :
Докажем следующее утверждение для нахождения интервала
:Утверждение: |
TODO |
Результат
- Делим строку пополам
- Рекурсивно запускаемся от полученных строк
- Вычислим LP, LS, RP, RS для t с помощью z-функции:
- Найдем правые и левые повторы, как изложено выше:
Асимптотика
Ассимптотика алгоритма "разделяй и властвуй", каждый рекурсивный запуск которого линеен относительно длины строки,
.Количество блоков в ответе также будет
, так как при каждом рекрсивном запуске добавляется блоков для каждой рассмотренной длины повтора, а их количество линейно относительно длины строки.