Алгоритм цифровой сортировки суффиксов циклической строки — различия между версиями
(Новая страница: «{{В разработке}} Дана строка <tex>s</tex>. Требуется отсортировать все её суффиксы. Поскольку мы …») |
(нет различий)
|
Версия 07:20, 5 мая 2011
Эта статья находится в разработке!
Дана строка
. Требуется отсортировать все её суффиксы. Поскольку мы сортируем циклические сдвиги, то и подстроки мы будем рассматривать циклические: под подстрокой , когда , понимается подстрока . Кроме того, предварительно все индексы берутся по модулю длины строки.Рассматриваемый алгоритм состоит из примерно
фаз. На той фазе ( ) сортируются циклические подстроки длины . На последней, ой фазе, будут сортироваться подстроки длины , что эквивалентно сортировке циклических сдвигов.На каждой фазе алгоритм помимо перестановки
индексов циклических подстрок будет поддерживать для каждой циклической подстроки, начинающейся в позиции с длиной , номер класса эквивалентности , которому эта подстрока принадлежит. В самом деле, среди подстрок могут быть одинаковые, и алгоритму понадобится информация об этом. Кроме того, номера классов эквивалентности , будем давать таким образом, чтобы они сохраняли и информацию о порядке: если один суффикс меньше другого, то и номер класса он должен получить меньший.Перейдём теперь к более подробному описанию алгоритма
На нулевой фазе мы должны отсортировать циклические подстроки длины
, т.е. отдельные символы строки, и разделить их на классы эквивалентности (одинаковые символы должны быть отнесены к одному классу эквивалентности). Это можно сделать сортировкой подсчётом. Для каждого символа посчитаем, сколько раз он встретился. Потом по этой информации восстановим массив . После этого, проходом по массиву и сравнением символов, строится массив .Далее, пусть мы выполнили
ю фазу (т.е. вычислили значения массивов и для неё). Научимся за выполнять следующую, ю, фазу. Поскольку фаз всего , это даст нам требуемый алгоритм с временем .Заметим, что циклическая подстрока длины
состоит из двух подстрок длины , которые мы можем сравнивать между собой за , используя информацию с предыдущей фазы — номера классов эквивалентности . Таким образом, для подстроки длины , начинающейся в позиции , вся необходимая информация содержится в паре чисел .