Алгоритм Касаи и др. — различия между версиями
Строка 4: | Строка 4: | ||
==Обозначения== | ==Обозначения== | ||
− | Задана строка <tex>A</tex>. Тогда <tex>A_{i}</tex> {{---}} | + | Задана строка <tex>A</tex>. Тогда <tex>A_{i}</tex> {{---}} суффикс строки <tex>A</tex>, начинающийся в <tex>i</tex>-ом символе. Пусть задан суффиксный массив <tex>Pos</tex>. Для вычисления <tex>LCP</tex> будем использовать промежуточный массив <tex>Rank</tex>. Массив <tex>Rank</tex> определен как обратный к массиву <tex>Pos</tex>. Он может быть получен немедленно, если задан массив <tex>Pos</tex>. Если <tex>Pos[k] = i</tex>, то <tex>Rank[i] = k</tex>. |
<tex>Height[i]</tex> {{---}} длина наибольшего общего префикса <tex>i</tex> и <tex>i-1</tex> строк в суффиксном массиве (<tex>Pos[i]</tex> и <tex>Pos[i-1]</tex> соответственно). | <tex>Height[i]</tex> {{---}} длина наибольшего общего префикса <tex>i</tex> и <tex>i-1</tex> строк в суффиксном массиве (<tex>Pos[i]</tex> и <tex>Pos[i-1]</tex> соответственно). | ||
Строка 10: | Строка 10: | ||
==Некоторые свойства <tex>LCP</tex>== | ==Некоторые свойства <tex>LCP</tex>== | ||
===Факт №1=== | ===Факт №1=== | ||
− | <tex>LCP</tex> между двумя | + | <tex>LCP</tex> между двумя суффиксами {{---}} это минимум <tex>LCP</tex> всех пар смежных суффиксов между ними в суффиксном массиве <tex>Pos</tex>. То есть <tex>LCP(A_{Pos[x]}, A_{Pos[z]}) = min_{x < y \le z}(LCP(A_{Pos[y - 1]},A_{Pos[y]})</tex>. |
− | Отсюда следует, что <tex>LCP</tex> пары соседних | + | Отсюда следует, что <tex>LCP</tex> пары соседних суффиксов в массиве <tex>Pos</tex> больше или равно <tex>LCP</tex> пары суффиксов, окружающих их. |
{{Утверждение | {{Утверждение | ||
Строка 18: | Строка 18: | ||
===Факт №2=== | ===Факт №2=== | ||
− | Если значение <tex>LCP</tex> между парой соседних | + | Если значение <tex>LCP</tex> между парой соседних суффиксов, смежных в массиве <tex>Pos</tex> больше <tex>1</tex>, то лексикографический порядок суффиксов сохранится, если удалить первый символ каждого суффикса.<br> |
{{Утверждение | {{Утверждение | ||
|statement= | |statement= | ||
Строка 29: | Строка 29: | ||
}} | }} | ||
− | Теперь рассмотрим следующую задачу: | + | Теперь рассмотрим следующую задачу: рассчитать <tex>LCP</tex> между суффиксом <tex>A_{i}</tex> и его смежным суффиксом в массиве <tex>Pos</tex>, при условии, что значение <tex>LCP</tex> между <tex>A_{i-1}</tex> и его смежным суффиксом известны. Для удобства записи пусть <tex>p=Rank[i - 1]</tex> и <tex>q = Rank[i]</tex>. Так же пусть <tex>j - 1 = Pos[p-1]</tex> и <tex>k = Pos[q - 1]</tex>. Проще говоря, мы хотим посчитать <tex>Height[q]</tex>, когда задано <tex>Height[p]</tex> |
{{Лемма|statement= | {{Лемма|statement= |
Версия 16:49, 21 апреля 2012
Алгоритм Касаи (Аримуры-Арикавы-Касаи-Ли-Парка) — алгоритм, позволяющий за линейное время вычислить значения наибольших общих префиксов для соседних циклических сдвигов строки, отсортированных в лексикографическом порядке (largest common prefix, далее
).Содержание
Обозначения
Задана строка
. Тогда — суффикс строки , начинающийся в -ом символе. Пусть задан суффиксный массив . Для вычисления будем использовать промежуточный массив . Массив определен как обратный к массиву . Он может быть получен немедленно, если задан массив . Если , то .— длина наибольшего общего префикса и строк в суффиксном массиве ( и соответственно).
Некоторые свойства
Факт №1
между двумя суффиксами — это минимум всех пар смежных суффиксов между ними в суффиксном массиве . То есть . Отсюда следует, что пары соседних суффиксов в массиве больше или равно пары суффиксов, окружающих их.
Утверждение: |
Факт №2
Если значение
Утверждение: |
Если , тогда |
Факт №3
В этом же случае, значение
Утверждение: |
Если , тогда |
Теперь рассмотрим следующую задачу: рассчитать
между суффиксом и его смежным суффиксом в массиве , при условии, что значение между и его смежным суффиксом известны. Для удобства записи пусть и . Так же пусть и . Проще говоря, мы хотим посчитать , когда заданоЛемма: |
Если , тогда |
Доказательство: |
Так как | , имеем из факта №2. Так как , имеем из факта №1
Теорема: |
Если , то |
Доказательство: |
(из Леммы) = (из факта №3). |
Описание алгоритма
Таким образом, начиная проверять
для текущего суффикса не с первого символа, а с указанного, можно за линейное время построить . Покажем, что построение таким образом действительно требует времени. Действительно, на каждой итерации текущее значение может быть не более чем на единицу меньше предыдущего. Таким образом, значения в сумме могут увеличиться не более, чем на (с точностью до константы). Следовательно, алгоритм построит за .Источники
1. Алгоритм Касаи.
2. T.Kasai, G.Lee, H.Arimura, S.Arikawa, K.Park - Linear-Time Longest-Common-Prefix Computation in Suffix Arrays and Its Application.