Алгоритм Мейна-Лоренца — различия между версиями
Mariashka (обсуждение | вклад) |
Mariashka (обсуждение | вклад) |
||
| Строка 66: | Строка 66: | ||
Количество блоков в ответе также будет <tex> O(n \log n) </tex>, так как при каждом рекрсивном запуске добавляется <tex> O(1) </tex> блоков для каждой рассмотренной длины повтора, а их количество линейно относительно длины строки. | Количество блоков в ответе также будет <tex> O(n \log n) </tex>, так как при каждом рекрсивном запуске добавляется <tex> O(1) </tex> блоков для каждой рассмотренной длины повтора, а их количество линейно относительно длины строки. | ||
| − | == Источники == | + | == Источники информации == |
* ''Main, M., Lorentz, R.J.'' — '''An O(n log n) Algorithm for Finding All Repetitions in a String'''. 1982 | * ''Main, M., Lorentz, R.J.'' — '''An O(n log n) Algorithm for Finding All Repetitions in a String'''. 1982 | ||
* ''Билл Смит'' — '''Методы и алгоритмы вычислений на строках'''. Пер. с англ.{{---}} М.:Издательский дом "Вильямс", 2006. ISBN 5-8459-1081-1 | * ''Билл Смит'' — '''Методы и алгоритмы вычислений на строках'''. Пер. с англ.{{---}} М.:Издательский дом "Вильямс", 2006. ISBN 5-8459-1081-1 | ||
| + | |||
| + | == См. также == | ||
| + | |||
| + | * [[Алгоритм Ландау-Шмидта]] | ||
| + | * [[Алгоритм Крочемора]] | ||
Версия 17:18, 30 апреля 2015
Алгоритм Мейна-Лоренца (англ. Main-Lorentz algorithm) — алгоритм на строках, позволяющий найти все повторы в строке за
Содержание
Алгоритм
Так как повторов строке , мы не можем хранить их в явном виде. Будем хранить повторы блоками вида , где — это длина повтора, а — промежуток индексов, в каждом из которых заканчивается повтор такой длины. Для каждой длины может быть несколько блоков.
Данный алгоритм — это алгоритм типа "разделяй и властвуй": разделим строку пополам, рекурсивно запустимся от каждой половинки — так мы найдем повторы, которые не пересекают границу раздела. Далее рассмотрим процесс нахождения повторов, которые пересекают границу раздела. Их можно разделить на две группы по положению центра повтора: правые и левые.
Нахождение правых повтров
Рассмотрим строку , пусть — индекс начала в исходной строке .
- Разобьем ее на две строки и .
- Предподсчитаем следующие массивы c помощью Z-функции:
- , то есть наибольший общий префикс строк и
- , то есть наибольший общий суффикс строк и
- Переберем длину повтора и будем искать все повторы такой длины: для каждого получим интервал индексов конца повтора в строке : (по формуле, которую докажем позднее). Добавим полученный интервал к ответу, учитывая смещение в исходной строке :
Итоговая асимптотика:
Докажем следующее утверждение для нахождения интервала :
Нахождение левых повтров
Рассмотрим строку , пусть — индекс начала в исходной строке .
- Разобьем ее на две строки и .
- Предподсчитаем следующие массивы с помощью Z-функции:
- , то есть наибольший общий префикс строк и
- , где — наибольший общий суффикс строк и
- Переберем длину повтора и будем искать все повторы такой длины: для каждого получим интервал индексов конца повтора в строке : (по формуле, которую докажем позднее). Добавим полученный интервал к ответу, учитывая смещение в исходной строке :
Итоговая асимптотика:
Докажем следующее утверждение для нахождения интервала :
Асимптотика
Асимптотика алгоритма "разделяй и властвуй", каждый рекурсивный запуск которого линеен относительно длины строки, из рекурентного соотношения (аналогичное доказательство для сортировки слиянием).
Количество блоков в ответе также будет , так как при каждом рекрсивном запуске добавляется блоков для каждой рассмотренной длины повтора, а их количество линейно относительно длины строки.
Источники информации
- Main, M., Lorentz, R.J. — An O(n log n) Algorithm for Finding All Repetitions in a String. 1982
- Билл Смит — Методы и алгоритмы вычислений на строках. Пер. с англ.— М.:Издательский дом "Вильямс", 2006. ISBN 5-8459-1081-1