Алгоритм Карккайнена-Сандерса — различия между версиями
Строка 10: | Строка 10: | ||
== Алгоритм == | == Алгоритм == | ||
+ | === Шаг 1 === | ||
+ | На первом шаге мы строим суффиксный массив <tex> A_{S_e} </tex> для суффиксов строки <tex> S </tex>, начинающихся в четных позициях. | ||
+ | |||
+ | # Отобразим исходную строку <tex> S </tex> длины <tex> n </tex> в строку <tex> S' </tex> длины <tex> \frac{n}{2} </tex> следующим образом: | ||
+ | #* Сделаем список, состоящий из пар символов вида <tex> S[2i]S[2i + 1] </tex>, где <tex> i \in [0; n / 2) </tex>. {{TODO| t=что делать с четностью?}} | ||
+ | #* Отсортируем его цифровой сортировкой за линейное время и получим новый алфавит <tex> \Sigma' </tex>. | ||
+ | #* Перекодируем строку <tex> S </tex> в алфавит <tex> \Sigma' </tex>, получив строку <tex> S' </tex> половинной длины. | ||
+ | # Рекурсивно построим суффиксный массив <tex> A_{S'} </tex>. | ||
+ | # Построим суффиксный массив <tex> A_{S_e} </tex>. Очевидно, <tex> A_{S_e}[i] = 2 A_{S'}[i] </tex>, так отношение упорядоченности любых двух строк в старом алфавите <tex> \Sigma </tex> эквивалентно отношению упорядоченности в новом алфавите <tex> \Sigma' </tex> по его построению. | ||
+ | |||
+ | === Шаг 2 === | ||
+ | На этом шаге мы за линейное время получим суффиксный массив <tex> A_{S_o} </tex> для суффиксов строки, начинающихся в нечетных позициях, используя уже построенный <tex> A_{S_e} </tex>. | ||
+ | |||
+ | === Шаг 3 === | ||
Для суффиксного дерева третий шаг алгоритма опирается на специфические особенности суффиксных деревьев, которые не присущи суффиксным массивам. | Для суффиксного дерева третий шаг алгоритма опирается на специфические особенности суффиксных деревьев, которые не присущи суффиксным массивам. | ||
− | В случае суффиксного массива | + | В случае суффиксного массива слияние становится очень сложным <ref> D. K. Kim, J. S. Sim, H. Park, and K. Park. Linear-time construction of suffix arrays. http://www.springerlink.com/content/568156021q45r320/</ref>. Однако простой модификацией алгоритма можно значительно упростить его. |
== Алгоритм skew == | == Алгоритм skew == |
Версия 18:06, 28 марта 2012
Алгоритм Каркайнена-Сандерса (Karkkainen, Sanders) — алгоритм построения суффиксного массива за линейное время.
Базовая идея
Алгоритм базируется на алгоритме Фараха[1] построения суффиксного дерева за линейное время:
- Строим суффиксное дерево для суффиксов, начинающихся в четных позициях, рекурсивно сведя задачу к построению суффиксного дерева для строки половинной длины.
- Строим суффиксное дерево для суффиксов, начинающихся в нечетных позициях за линейное время, используя результат для четных позиций.
- Сливаем суффиксные деревья за линейное время.
Получили асимптотическое уравнение
, решением которого является .Алгоритм
Шаг 1
На первом шаге мы строим суффиксный массив
для суффиксов строки , начинающихся в четных позициях.- Отобразим исходную строку
- Сделаем список, состоящий из пар символов вида , где .
длины в строку длины следующим образом:
TODO: что делать с четностью?
- Отсортируем его цифровой сортировкой за линейное время и получим новый алфавит .
- Перекодируем строку в алфавит , получив строку половинной длины.
- Рекурсивно построим суффиксный массив .
- Построим суффиксный массив . Очевидно, , так отношение упорядоченности любых двух строк в старом алфавите эквивалентно отношению упорядоченности в новом алфавите по его построению.
Шаг 2
На этом шаге мы за линейное время получим суффиксный массив
для суффиксов строки, начинающихся в нечетных позициях, используя уже построенный .Шаг 3
Для суффиксного дерева третий шаг алгоритма опирается на специфические особенности суффиксных деревьев, которые не присущи суффиксным массивам. В случае суффиксного массива слияние становится очень сложным [2]. Однако простой модификацией алгоритма можно значительно упростить его.
Алгоритм skew
Изменим изначальный алгоритм следующим образом:
- Построим суффиксный массив для суффиксов, соответствующих не кратным трем позициям. Рекурсивно сведем это к построению суффиксного массива для строки длиной в две трети исходной.
- Построим суффиксный массив для суффиксов, соответствующих кратных трем позициям, используя результат первого шага за линейное время.
- Сливаем эти суффиксные массивы в один за линейное время.
Получили асимптотическое уравнение
, решением которого также является (это видно из того, что сумма геометрической прогрессии с основанием равна ).
TODO: впилить описание сливания
Ссылки
- ↑ M. Farach. Optimal suffix tree construction with large alphabets. http://www.cs.rutgers.edu/~farach/pubs/FarFerrMuthu00.pdf
- ↑ D. K. Kim, J. S. Sim, H. Park, and K. Park. Linear-time construction of suffix arrays. http://www.springerlink.com/content/568156021q45r320/