Участница:Mariashka — различия между версиями
Mariashka (обсуждение | вклад) (Новая страница: «{{Определение |definition = '''Повтором''' (англ. ''repeatition'') называется непустая строка вида <math>\alpha...») |
(нет различий)
|
Версия 23:00, 26 апреля 2015
Определение: |
Повтором (англ. repeatition) называется непустая строка вида |
Алгоритм Мейна-Лоренца (англ. Main-Lorentz algorithm) — алгоритм на строках, позволяющий найти все повторы в строке
заСодержание
Алгоритм
Данный алгоритм - это алгоритм "разделяй и властвуй":
- Разделим строку пополам
- Заметим, что повторы делятся на две группы: пересекающие и не пересекающие границу раздела
- Рекурсивно запустимся от каждой половинки - так мы найдем повторы, которые не пересекают границу раздела
- Рассмотрим нахождение повторов, которые пересекают границу раздела
Нахождение повторов
Повторы, пересекающие границу раздела, можно разделить на две группы по положению центра повтора. Центр в правой половине - правый повтор, в левой части - в левой.
Так как повторов строке
, мы не можем хранить их в явном виде. Будем хранить повторы блоками вида , где - это длина повтора, а - промежуток индексов, в которых заканчиваются повторы такой длины.Нахождение правых повтров
Рассмотрим строку
. Переберем длину повтора . Для каждого получим неравенство для - индекса конца повтора в строке . Так как мы рассматриваем повторы, пересекающие границу, повтор всегда оканчивается в . Для этого предподсчитаем следующие массивы:- , где - наибольший общий префикс
- , где - наибольший общий суффикс
Утверждение: |
TODO |
Нахождение левых повтров
Рассмотрим строку
. Переберем длину повтора . Для каждого получим неравенство для - индекса конца повтора в строке . Для этого предподсчитаем следующие массивы:- , где - наибольший общий префикс
- , где - наибольший общий суффикс
Утверждение: |
TODO |