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

Перейти к навигации Перейти к поиску
м
нет описания правки
мНет описания правки
Строка 6: Строка 6:




Простым примером полнотекстового индекса является [[суффиксный массив]] A[1, n], содержащий перестановку интервала [1, n], такую, что T[A[i], n] < T[A[i + 1], n] для всех <math>1 \le i < n</math>, где отношение "<" между строками обозначает лексикографический порядок. Используя суффиксный массив, можно найти вхождения заданного шаблона <math>P = p_1 p_2 ... p_m</math> в строке T с помощью двух бинарных поисков за время O(m log n).
Простым примером полнотекстового индекса является ''суффиксный массив'' A[1, n], содержащий перестановку интервала [1, n], такую, что T[A[i], n] < T[A[i + 1], n] для всех <math>1 \le i < n</math>, где отношение "<" между строками обозначает лексикографический порядок. Используя суффиксный массив, можно найти вхождения заданного шаблона <math>P = p_1 p_2 ... p_m</math> в строке T с помощью двух бинарных поисков за время O(m log n).




Строка 24: Строка 24:
2) асимптотически оптимально относительно размера текста, т. е. <math>n \; log \; \sigma (1 + o(1))</math> бит;
2) асимптотически оптимально относительно размера текста, т. е. <math>n \; log \; \sigma (1 + o(1))</math> бит;


3) пропорционально размеру ''сжатого'' текста, т. е. <math>O(nH_k)</math> бит, где <math>O(H_k)</math> — это (эмпирическая) ''энтропия k-го порядка'' строки <math>T^1</math>; или даже
3) пропорционально размеру ''сжатого'' текста, т. е. <math>O(nH_k)</math> бит, где <math>O(H_k)</math> — это (эмпирическая) ''энтропия k-го порядка'' строки T ''//где <math>H_k</math> — минимальное среднее количество бит, необходимых для кодирования одного символа с помощью любого алгоритма сжатия, который фиксирует кодовое слово на основе контекста k-го символа, следующего за кодируемым символом. В [6] дано более формальное определение//'';


или даже
4) асимптотически оптимально относительно размера сжатого текста, т. е. <math>O(nH_k) + o(n \; log \; \sigma)</math> бит.
4) асимптотически оптимально относительно размера сжатого текста, т. е. <math>O(nH_k) + o(n \; log \; \sigma)</math> бит.


Строка 35: Строка 36:




Гросси и Виттер используют иерархическую декомпозицию массива А, основанную на <math>\Psi^2</math>. рассмотрим первый уровень этой иерархической декомпозиции. Пусть <math>A_0 = A</math> – исходный суффиксный массив. Битовый вектор <math>B^0 [1, n]</math> определен таким образом, что <math>B^0 [i] = 1</math> в том и только том случае, если A[i] четно. Кроме того, пусть <math>\Psi_0 [1, \lceil n/2 \rceil ]</math> содержит последовательность значений <math>\Psi(i)</math> для тех аргументов i, для которых <math>B^0[i] = 0</math>. Наконец, пусть <math>A_1 [1, \lfloor n/2 \rfloor ]</math> будет подпоследовательностью <math>A_0 [1, n]</math>, образованной четными значениями <math>A_0[i]</math>, деленными на 2.
Гросси и Виттер используют иерархическую декомпозицию массива А, основанную на <math>\Psi</math> ''//далее приводится описание, близкое к изложенному в [9]//''. рассмотрим первый уровень этой иерархической декомпозиции. Пусть <math>A_0 = A</math> – исходный суффиксный массив. Битовый вектор <math>B^0 [1, n]</math> определен таким образом, что <math>B^0 [i] = 1</math> в том и только том случае, если A[i] четно. Кроме того, пусть <math>\Psi_0 [1, \lceil n/2 \rceil ]</math> содержит последовательность значений <math>\Psi(i)</math> для тех аргументов i, для которых <math>B^0[i] = 0</math>. Наконец, пусть <math>A_1 [1, \lfloor n/2 \rfloor ]</math> будет подпоследовательностью <math>A_0 [1, n]</math>, образованной четными значениями <math>A_0[i]</math>, деленными на 2.


Hk — это минимальное среднее количество битов, необходимых для кодирования одного символа с помощью любого алгоритма сжатия, который фиксирует кодовое слово на основе контекста k-го символа, следующего за кодируемым символом. В [6] дано более формальное определение.
2 Далее приводится описание, близкое к изложенному в [9].


Тогда A = A0 может быть представлен с использованием только ^Q, B° и A1. Чтобы получить A[i], сначала проверим, верно ли B°[i] = 1. Если это так, то A[i] (делится на 2) где-то в A1. Точное положение зависит от того, сколько единиц встречается в B° до позиции i, обозначенной rank(B°;i), т.е. A[i] = 2 ■ A1[rank1(B° ; i)]. Если B°[i] = 0, то A[i] является нечетным и не представлен в A1. Однако в этом случае элемент A[i] + 1 = A[^(i)] должен быть четным и, таким образом, должен быть представлен в A1. Так как WQ включает только 4> значения, где B°[i] = 0, из этого следует, что A[V(i)] = A[W0[rank0(B°, i)]]. После вычисления A[^(i)] (для четных ФЦ)) можно просто получить A[i] = A[4s(i)] - 1.
Тогда A = A0 может быть представлен с использованием только ^Q, B° и A1. Чтобы получить A[i], сначала проверим, верно ли B°[i] = 1. Если это так, то A[i] (делится на 2) где-то в A1. Точное положение зависит от того, сколько единиц встречается в B° до позиции i, обозначенной rank(B°;i), т.е. A[i] = 2 ■ A1[rank1(B° ; i)]. Если B°[i] = 0, то A[i] является нечетным и не представлен в A1. Однако в этом случае элемент A[i] + 1 = A[^(i)] должен быть четным и, таким образом, должен быть представлен в A1. Так как WQ включает только 4> значения, где B°[i] = 0, из этого следует, что A[V(i)] = A[W0[rank0(B°, i)]]. После вычисления A[^(i)] (для четных ФЦ)) можно просто получить A[i] = A[4s(i)] - 1.
4446

правок

Навигация