Алгоритм цифровой сортировки суффиксов циклической строки
Дана строка . Требуется отсортировать все её суффиксы. Поскольку мы сортируем циклические сдвиги, то и подстроки мы будем рассматривать циклические: под подстрокой , когда , понимается подстрока . Кроме того, предварительно все индексы берутся по модулю длины строки.
Рассматриваемый алгоритм состоит из примерно фаз. На той фазе () сортируются циклические подстроки длины . На последней, ой фазе, будут сортироваться подстроки длины , что эквивалентно сортировке циклических сдвигов.
На каждой фазе алгоритм помимо перестановки индексов циклических подстрок будет поддерживать для каждой циклической подстроки, начинающейся в позиции с длиной , номер класса эквивалентности , которому эта подстрока принадлежит. В самом деле, среди подстрок могут быть одинаковые, и алгоритму понадобится информация об этом. Кроме того, номера классов эквивалентности , будем давать таким образом, чтобы они сохраняли и информацию о порядке: если один суффикс меньше другого, то и номер класса он должен получить меньший.
Перейдём теперь к более подробному описанию алгоритма
На нулевой фазе мы должны отсортировать циклические подстроки длины , т.е. отдельные символы строки, и разделить их на классы эквивалентности (одинаковые символы должны быть отнесены к одному классу эквивалентности). Это можно сделать сортировкой подсчётом. Для каждого символа посчитаем, сколько раз он встретился. Потом по этой информации восстановим массив . После этого, проходом по массиву и сравнением символов, строится массив .
Далее, пусть мы выполнили ю фазу (т.е. вычислили значения массивов и для неё). Научимся за выполнять следующую, ю, фазу. Поскольку фаз всего , это даст нам требуемый алгоритм с временем .
Заметим, что циклическая подстрока длины состоит из двух подстрок длины , которые мы можем сравнивать между собой за , используя информацию с предыдущей фазы — номера классов эквивалентности . Таким образом, для подстроки длины , начинающейся в позиции , вся необходимая информация содержится в паре чисел .