Сжатый суффиксный массив: различия между версиями

Перейти к навигации Перейти к поиску
Строка 66: Строка 66:




Садаканэ представляет и A, и T, используя полную функцию <math>\Psi</math> и несколько дополнительных структур. Предположим, что требуется сравнить P с T[A[i]; n]. Для бинарного поиска необходимо извлечь из T[A[i]; n] достаточное количество символов, чтобы его лексикографическое отношение к P стало понятным. Получить символ T[A[i]] легко: для этого можно использовать битовый вектор F[1; n], отмечающий суффиксы A[ i], у которых первый символ отличается от такого же символа в A[i 1]. После предварительной обработки вектора F для запросов rank вычисление j = rank1(F; i) дает T[A[i]] = cj, где cj  это j-ый наименьший символ алфавита. Как только T[A[i]] = cj будет определен таким образом, необходимо получить следующий символ, T[A[i] + 1]. Но T[A[i] + 1] = T[A[V{i)}}, поэтому можно просто перейти к i0 = ^(i) и продолжать извлекать символы тем же способом, сколько потребуется. Следует отметить, что в большинстве случаев jPj = m символов достаточно для сравнения с P. Таким образом, моделирование бинарного поиска выполняется за время O(m log n).
Садаканэ представляет и A, и T, используя полную функцию <math>\Psi</math> и несколько дополнительных структур. Предположим, что требуется сравнить P с T[A[i], n]. Для бинарного поиска необходимо извлечь из T[A[i], n] достаточное количество символов, чтобы его лексикографическое отношение к P стало понятным. Получить символ T[A[i]] легко: для этого можно использовать битовый вектор F[1, n], отмечающий суффиксы A[i], у которых первый символ отличается от такого же символа в A[i - 1]. После предварительной обработки вектора F для запросов ''rank'' вычисление <math>j = rank_1(F, i)</math> дает <math>T[A[i]] = c_j</math>, где <math>c_j</math> – это j-ый наименьший символ алфавита. Как только <math>T[A[i]] = c_j</math> будет определен таким образом, необходимо получить следующий символ, <math>T[A[i] + 1]</math>. Но <math>T[A[i] + 1] = T[A[\Psi(i)]]</math>, поэтому можно просто перейти к <math>i' = \Psi(i)</math> и продолжать извлекать символы тем же способом, сколько потребуется. Следует отметить, что в большинстве случаев |P| = m символов достаточно для сравнения с P. Таким образом, моделирование бинарного поиска выполняется за время O(m log n).




До этого момента было использовано n + o(n) + a log a бит памяти для F и S. Садаканэ [10] дает улучшенное представление для <math>\Psi</math>, используя nH0 + O(n log log cr) бит, где H0 – энтропия T нулевого порядка.
До этого момента было использовано <math>n + o(n) + \sigma \; log \; \sigma</math> бит памяти для <math>F</math> и <math>\Sigma</math>. Садаканэ [10] дает улучшенное представление для <math>\Psi</math>, используя <math>nH_0 + O(n \; log \; log \; \sigma)</math> бит, где <math>H_0</math> – энтропия T нулевого порядка.




4446

правок

Навигация