Алгоритм Крочемора — различия между версиями
(→Упрощенный алгоритм) |
(→Оптимизация) |
||
| Строка 72: | Строка 72: | ||
| − | + | Заметим, что декомпозицию можно выполнить, основываясь не на разбиваемой последовательности, а на последовательностях, относительно которых будут разбиваться другие последовательности. | |
| − | |||
| − | + | Для каждой позиции <tex>p_i > 1</tex> известно, что подстрока <tex>s[p_i - 1 \ldots p_i + l - 1]</tex> (длиной <tex>l + 1</tex>) относится к некоторой последовательности <tex>c^{(l + 1)}_{j'}</tex> на уровне <tex>l + 1</tex>. Поскольку последовательность <tex>c^{(l)}_{j}</tex> соответствует уникальной подстроке строки <tex>s</tex>, то каждая такая последовательность <tex>c^{(l + 1)}_{j'}</tex> должна формироваться из тех же позиций <tex>p_{i_1}, p_{i_2}, \ldots , p_{i_k}</tex> последовательности <tex>c^{(l)}_{j}</tex>, которые определяют класс эквивалентности | |
| − | <tex>c^{( | + | <tex>s[p_{i_1} - 1] = s[p_{i_2} - 1] = \ldots = s[p_{i_k} - 1]</tex>. |
| − | + | ||
| + | |||
| + | Таким образом, декомпозицию на уровне <tex>l + 1</tex> можно выполнить косвенным путем, рассматривая каждую последовательность уровня <tex>l</tex> с позиции, находящейся на <tex>1</tex> левее от начальной позиции этой последовательности. | ||
= Псевдокод = | = Псевдокод = | ||
Версия 06:15, 28 мая 2014
| Определение: |
| Тандемным повтором (tandem repeat) в строке называются два вхождения какой-либо подстроки подряд. Иными словами, тандемный повтор описывается парой индексов такими, что подстрока — это две одинаковые строки, записанные подряд. |
Алгоритм Крочемора (Crochemore algorithm) - алгоритм на строках, позволяющий найти все тандемные повторы в строке за
Содержание
Идея
Разобьем описание алгоритма на две части: сначала покажем упрощенный алгоритм, работающий за \, а затем попытаемся его оптимизировать до
Упрощенный алгоритм
Рассмотрим следующую строку Фиббоначи:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |
| a | b | a | a | b | a | b | a | a | b | a | a | b |
Будем вычислять все повторяющиеся подстроки длины , где . Зная эти данные, мы автоматически находим все тандемные повторы.
Предположим, что в строке вычислены последовательности позиций, в которых встречаются одинаковые символы:
| <1, 3, 4, 6, 8, 9, 11, 12> | <2, 5, 7, 10, 13> | |
| a | b |
Если нам заранее известен алфавит и он индексирован, то мы можем выполнить данное вычисление за .
Далее для мы хотим найти все повторяющиеся подстроки длины . Поскольку повторяющиеся подстроки длины будут иметь общий префикс длиной , то вычисления уровня должны привести к последовательностям, которые будут подпоследовательностями последовательностей, вычисленных на уровне . Другими словами, разбиение на уровне — декомпозиция разбиения на уровне :
| Последовательная декомпозиция строки | |||||
|---|---|---|---|---|---|
| <1, 4, 6, 9, 12> | <3, 8, 11> | <2, 5, 7, 10> | <13> | ||
| ab | aa | ba | b$ | ||
| <1, 4, 6, 9> | <12> | <3, 8, 11> | <2, 7, 10> | <5> | |
| aba | aa$ | aab | baa | bab | |
| <1, 6, 9> | <4> | <3, 8> | <11> | <2, 7, 10> | |
| abaa | abab | aaba | aab$ | baab | |
| <1, 6, 9> | <3> | <8> | <2, 7> | <10> | |
| abaab | aabab | aabaa | baaba | baab$ | |
| <1, 6> | <9> | <2> | <7> | ||
| abaaba | abaab$ | baabab | baabaa | ||
| <1> | <6> | ||||
| abaabab | abaabaa | ||||
Если реализовывать процесс декомпозиции "наивно", то поучаем сложность
Оптимизация
Декомпозицию каждой последовательности можно получить косвенным путем, а не путем прямых вычислений. Идея такого подхода состоит в следующем: на каждом уровне выполняется непосредственная декомпозиция каждой последовательности . Более точно, если , то необходимо проверить совпадение букв , и, если какие-либо пары букв и равны, то и помещаются в одну и ту же последовательность на уровне .
Заметим, что декомпозицию можно выполнить, основываясь не на разбиваемой последовательности, а на последовательностях, относительно которых будут разбиваться другие последовательности.
Для каждой позиции известно, что подстрока (длиной ) относится к некоторой последовательности на уровне . Поскольку последовательность соответствует уникальной подстроке строки , то каждая такая последовательность должна формироваться из тех же позиций последовательности , которые определяют класс эквивалентности
.
Таким образом, декомпозицию на уровне можно выполнить косвенным путем, рассматривая каждую последовательность уровня с позиции, находящейся на левее от начальной позиции этой последовательности.