Участница:Mariashka — различия между версиями
Mariashka (обсуждение | вклад) |
Mariashka (обсуждение | вклад) |
||
| Строка 31: | Строка 31: | ||
|id=kindscount | |id=kindscount | ||
|statement=<math>2p -RS[p] \leq i \leq p - RP[p + 1]</math>, где <tex>i</tex> индекс конца повтора в строке <tex>v</tex>. | |statement=<math>2p -RS[p] \leq i \leq p - RP[p + 1]</math>, где <tex>i</tex> индекс конца повтора в строке <tex>v</tex>. | ||
| − | |proof= Рассмотрим правый повтор <tex>ww</tex>. | + | |proof= Рассмотрим правый повтор <tex>ww</tex>.<br> |
| − | + | Обозначим как <tex>k</tex> ту часть первой полвины повтора, которая принадлежит <tex>u</tex>, а как <tex>l</tex> {{---}} ту часть первого повтора, которая принадлежит <tex>v</tex>. Аналогичные во второй половине как <tex>m</tex> и <tex>n</tex>(см. рисунок). | |
[[Файл:RightRepetition.png|600px]]<br> | [[Файл:RightRepetition.png|600px]]<br> | ||
| − | + | Пусть <tex> b </tex> {{---}} длина <tex>k</tex>.<br> | |
Заметим, что <tex>w = k + l = m + n</tex> и <tex> k = m, l = n </tex>. <br> | Заметим, что <tex>w = k + l = m + n</tex> и <tex> k = m, l = n </tex>. <br> | ||
Тогда | Тогда | ||
| Строка 59: | Строка 59: | ||
|id=kindscount | |id=kindscount | ||
|statement=<math> p - LS[u.len - p] \leq i \leq LP[u.len - p + 1] </math> | |statement=<math> p - LS[u.len - p] \leq i \leq LP[u.len - p + 1] </math> | ||
| − | |proof= | + | |proof= Рассмотрим правый повтор <tex>ww</tex>.<br> |
| + | Обозначим как <tex>m</tex> ту часть первой второй повтора, которая принадлежит <tex>u</tex>, а как <tex>n</tex> {{---}} ту часть второго повтора, которая принадлежит <tex>v</tex>. Аналогичные во второй половине как <tex>k</tex> и <tex>l</tex>(см. рисунок). | ||
| + | |||
[[Файл:LeftRepetition.png|600px]]<br> | [[Файл:LeftRepetition.png|600px]]<br> | ||
| + | Пусть <tex> b </tex> {{---}} длина <tex>k+l+m</tex>. | ||
Заметим, что <tex>w = k + l = m + n</tex> и <tex> k = m, l = n </tex>. <br> | Заметим, что <tex>w = k + l = m + n</tex> и <tex> k = m, l = n </tex>. <br> | ||
Тогда | Тогда | ||
Версия 21:58, 28 апреля 2015
| Определение: |
| Повтором (англ. repeatition) называется непустая строка вида |
Алгоритм Мейна-Лоренца (англ. Main-Lorentz algorithm) — алгоритм на строках, позволяющий найти все повторы в строке за
Алгоритм
Так как повторов строке , мы не можем хранить их в явном виде. Будем хранить повторы блоками вида , где — это длина повтора, а — промежуток индексов, в которых заканчиваются повторы такой длины. Для каждой длины может быть несколько блоков.
Данный алгоритм — это алгоритм типа "разделяй и властвуй":
- Разделим строку пополам
- Заметим, что повторы делятся на две группы: пересекающие и не пересекающие границу раздела
- Рекурсивно запустимся от каждой половинки — так мы найдем повторы, которые не пересекают границу раздела
- Далее рассмотрим процесс нахождения повторов, которые пересекают границу раздела
Повторы, пересекающие границу раздела, можно разделить на две группы по положению центра повтора: правые и левые.
Нахождение правых повтров
Рассмотрим строку , пусть — индекс начала в исходной строке
- Предподсчитаем следующие массивы c помощью z-функции:
- , то есть наибольший общий префикс строк v[i..v.len] и v
- , то есть наибольший общий суффикс строк v[1..i] и u
- Переберем длину повтора и будем искать все повторы такой длины. Для этого для каждого получим интервал индексов конца повтора в строке : (позднее покажем, как это сделать).
- Добавим к ответу, учитывая смещение в исходной строке :
Итоговая асимптотика:
Докажем следующее утверждение для нахождения интервала :
Нахождение левых повтров
Рассмотрим строку , пусть — индекс начала в исходной строке
- Предподсчитаем следующие массивы с помощью z-функции:
- , то есть наибольший общий префикс строк u[i..u.len] и v
- , где — наибольший общий суффикс
- Переберем длину повтора и будем искать все повторы такой длины. Для этого для каждого получим интервал индексов конца повтора в строке : (позднее покажем, как это сделать).
- Добавим к ответу, учитывая смещение в исходной строке :
Итоговая асимптотика:
Докажем следующее утверждение для нахождения интервала :
Асимптотика
Ассимптотика алгоритма "разделяй и властвуй", каждый рекурсивный запуск которого линеен относительно длины строки, .
Количество блоков в ответе также будет , так как при каждом рекрсивном запуске добавляется блоков для каждой рассмотренной длины повтора, а их количество линейно относительно длины строки.