Изменения

Перейти к: навигация, поиск

Алгоритм Крочемора

1349 байт убрано, 08:39, 18 июня 2014
Нет описания правки
{{Определение
|definition =
'''Тандемным повтором''' (англ. "'tandem repeat"') в строке называются два вхождения какой-либо подстроки подряд. Иными словами, тандемный повтор описывается парой индексов <tex>i < j</tex> такими, что подстрока <tex>s[i \ldots j]</tex> {{---}} это две одинаковые строки, записанные подряд
}}
'''Алгоритм Крочемора''' (англ. "'crochemore algorithm"') {{---}} алгоритм на строках, позволяющий найти все тандемные повторы в строке <tex>s[1..n]</tex> за <tex>O(n \log n)</tex>
== Алгоритм ==
Разобьем описание алгоритма на две части: сначала покажем упрощенный алгоритм, работающий за <tex>O(n^2)</tex>, а затем попытаемся его оптимизировать до <tex>O(n \log n)</tex>
=== Упрощенный алгоритм ===
Рассмотрим следующую строку Фиббоначи:
Если реализовывать процесс декомпозиции "наивно", то поучаем сложность <tex>O(n^2)</tex>
=== Оптимизация ===
Декомпозицию каждой последовательности можно получить косвенным путем, а не путем прямых вычислений. Идея такого подхода состоит в следующем:
Поскольку строка <tex>s</tex> содержит <tex>n</tex> позиций, то из предыдущей леммы следует, что всего в малых последовательностях на всех уровнях содержится <tex>O(n \log n)</tex> позиций. Таким образом, если время обработки последовательностей на каждом уровне <tex>l</tex> пропорционально количеству элементов в малых последовательностях этого уровня, то полный процесс декомпозиции будет выполнен за <tex>O(n \log n)</tex>, чего мы и хотели получить.
== Псевдокод ==
crochemore()
<tex>l</tex> <tex>\gets</tex> 1
l++
Найдем малые последовательности на уровне <tex>l</tex>
 
= Реализация =
 
== Запись текущей последовательности для каждой позиции в строке ''s'' ==
* Массив '''seq''' {{---}} <tex>seq[i]</tex> содержит индекс текущей последовательности, которой принадлежит <tex>i-я</tex> позиция
* Массив '''seq_list''' {{---}} <tex>seq_list[i]</tex> содержит указатель на двусвязный список позиций, принадлежащих последовательности с индексом <tex>j</tex> и расположенных в порядке их возрастания
* Массив '''seq_size''' {{---}} <tex>seq_size[i]</tex> равно количеству позиций в последовательности с индексом <tex>j</tex>, т.е. количеству последовательностей в списке, на который указывает <tex>seq_list[j]</tex>
* Стек '''index_stack''' {{---}} стек неиспользованных индексов последовательностей
 
== Управление малыми последовательностями ==
 
== Организация подпоследовательностей ==
 
== Вычисление кратных строк ==
== Источники информации ==
Анонимный участник

Навигация