Индексирование сжатого текста: различия между версиями

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




Запросы display(i, j) общего вида основываются на  регулярной выборке из текста. Каждая текстовая позиция вида j' s, где s – частота дискретизации, хранится вместе с <math>SA^{-1} [j \cdot s]</math>, на которую указывает позиция суффиксного массива. Для выполнения запроса display(i, j) мы начинаем с наименьшей выбранной текстовой позиции j' s > j и применяем обращение процедуры BWT, начиная с <math>SA^{-1} [j \cdot s]</math> вместо i*. Это дает нам символы с j' s - 1 до i в обратном порядке и требует не более j - i + s шагов.
Запросы display(i, j) общего вида основываются на  регулярной выборке из текста. Каждая текстовая позиция вида <math>j' \cdot s</math>, где s – частота дискретизации, хранится вместе с <math>SA^{-1} [j \cdot s]</math>, на которую указывает позиция суффиксного массива. Для выполнения запроса display(i, j) мы начинаем с наименьшей выбранной текстовой позиции <math>j' \cdot s > j</math> и применяем обращение процедуры BWT, начиная с <math>SA^{-1} [j \cdot s]</math> вместо i*. Это дает нам символы с <math>j' \cdot s - 1</math> до i в обратном порядке и требует не более j - i + s шагов.




Кроме того, оказывается, что то же самое двухкомпонентное выражение LF[i] позволяет эффективно выполнять запросы типа count(P). Идея заключается в том, что если известен диапазон суффиксного массива, скажем SA[spi, epi], такого что единственными суффиксами, содержащими P[i, m] в качестве префикса, являются суффиксы T[SA[spi], n], T[SA[spi + 1], n], ..., T[SA[epi], n], то новый диапазон SA[sp,-_i, ep,-_i], суффиксы которого содержат P[i – 1, m] в качестве префикса, можно вычислить следующим образом: spi-i = C(P[i - 1]) + rankp[i-i](spi - 1) + 1 и epi-i = C(P[i - 1]) + rankp[i-i](epi). После этого достаточно просканировать шаблон в обратном порядке и вычислить значения C() и rankc() 2m раз, чтобы определить (возможно, пустой) диапазон суффиксного массива, в котором все суффиксы начинаются с полной P. Возврат ep1 - sp1 + 1 отвечает на запрос count(P), вообще не требуя наличия суффиксного массива.
Кроме того, оказывается, что то же самое двухкомпонентное выражение LF[i] позволяет эффективно выполнять запросы типа count(P). Идея заключается в том, что если известен диапазон суффиксного массива, скажем <math>SA[sp_i, ep_i]</math>, такого что единственными суффиксами, содержащими P[i, m] в качестве префикса, являются суффиксы <math>T[SA[sp_i], n], T[SA[sp_i + 1], n], ..., T[SA[ep_i], n]</math>, то новый диапазон <math>SA[sp_{i - 1}, ep_{i - 1}]</math>, суффиксы которого содержат P[i – 1, m] в качестве префикса, можно вычислить следующим образом: <math>sp_{i - 1} = C(P[i - 1]) + rank_{p_{[i - 1]}}(sp_i - 1) + 1</math> и <math>ep_{i - 1} = C(P[i - 1]) + rank_{p_{[i- 1]}}(ep_i)</math>. После этого достаточно просканировать шаблон ''в обратном порядке'' и вычислить значения C() и <math>rank_c()</math> 2m раз, чтобы определить (возможно, пустой) диапазон суффиксного массива, в котором все суффиксы начинаются с полной P. Возврат <math>ep_1 - sp_1 + 1</math> отвечает на запрос count(P), вообще не требуя наличия суффиксного массива.




Для локализации каждого такого вхождения SA[i], sp1 < i < ep1, можно вычислить последовательность i, LF[i], LF[LF[i]], ... до тех пор, пока не будет достигнут LF [i], являющийся выбранной позицией суффиксного массива и, таким образом, явно хранящийся в структуре выборки, предназначенной для запросов display(i, j). Тогда SA[i] = SA[LFk[i]] + k. Поскольку мы перемещаемся по тексту практически последовательно, мы не можем сделать в этом процессе более s шагов.
Для локализации каждого такого вхождения <math>SA[i], sp_1 \le i \le ep_1</math>, можно вычислить последовательность i, LF[i], LF[LF[i]], ... до тех пор, пока не будет достигнут <math>LF^k [i]</math>, являющийся выбранной позицией суффиксного массива и, таким образом, явно хранящийся в структуре выборки, предназначенной для запросов display(i, j). Тогда <math>SA[i] = SA[LF^k[i]] + k</math>. Поскольку мы перемещаемся по тексту практически последовательно, мы не можем сделать в этом процессе более s шагов.