Участница: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-функции:
- Найдем правые и левые повторы, как изложено выше:
Асимптотика
Ассимптотика алгоритма "разделяй и властвуй", каждый рекурсивный запуск которого линеен относительно длины строки, .
Количество блоков в ответе также будет , так как при каждом рекрсивном запуске добавляется блоков для каждой рассмотренной длины повтора, а их количество линейно относительно длины строки.