形式陈述
First–Last 对应
令 为追加唯一最小终止符后的文本,。 是它的BWT理路Burrows–Wheeler 变换Burrows-Wheeler transform · BWT对带唯一终止符文本的循环移位排序,并取最后一列形成可逆排列。 最后一列, 是排序后第一列。 为文本中严格小于字符 的字符数,Occ 为 中 的出现数。相同字符在 中按其后缀次序稳定对应,因此对行 ,
本文全部区间半开、Occ 不含位置 。它是二元rank 接口理路Rank 与 Select 查询Rank and select在位串上计算前缀频数或定位第 j 次出现,并固定端点和索引约定。在字符序列上的推广:对指示位串 ,有 ;实现可以共享编码,并不要求真的为每个字符存一整张位串。
反向搜索
若 恰好包含所有以模式 为前缀的后缀,且 与将加入的 都不含终止符,则前加 后的完整区间是
从空模式的全区间开始,按模式字符从右向左迭代;区间长度最终就是出现次数。每步做两次 rank理路Rank 与 Select 查询Rank and select在位串上计算前缀频数或定位第 j 次出现,并固定端点和索引约定。,在 rank 和 访问均为常数成本时,时间为 。空模式的全区间长度 ,恰对应原文的全部边界。
直觉
排序后的后缀把同一前缀聚成连续区间。BWT 末列记录每个后缀左边的字符,first–last 对应又保持相同字符的出现次序;因此统计当前区间内字符 的 occurrence rank,就能一次把整段后缀统一向左扩展。
LF 映射与反向搜索
例子与边界
banana$ 例子
在文本 banana$ 的 BWT 上搜索 ana:先由字符 a 得到所有 a 开头后缀的区间,再用 n 收缩为 na,最后用 a 收缩为 ana。某一步左右端相等即为空区间,之后模式不存在;不能继续把负长度或闭区间端点代入。
边界与逆映射
字符表次序决定 ,终止符必须唯一且最小。同一字符的第 次出现必须稳定对应,否则 LF 不再沿文本向前一位。LF 与 是方向相反的相关映射,不应混写公式。正文只给 count 区间;定位原文位置还需后缀数组采样及 LF 步进成本。
推论与应用
C 数组是字符总频率的前缀和理路前缀和Prefix sum · Cumulative sum预先累计序列前缀,使静态区间和查询可由两个前缀值相减得到。:C[c] 给出首列中严格小于 c 的字符数,再与 rankc(L,i) 相加定位同一字符的稳定次序。
公式证明与定位
中字符 占据从 开始的连续区间。 若按零起算的出现编号记为 ,first–last property 说明它对应 中同样编号为 的 ,位置正是 。反向区间公式只是把区间内所有 出现的编号范围映到这段 区间。
定位时取整数 ,保存所有满足 的行。每次 LF 令 值减一模 ,所以至多 步就遇到样本;把步数加回样本值并模 ,即恢复原位置。一次 LF 还要读取 和 ,这些访问与样本判定都须纳入单步成本。
按“每第 行”取样则没有这个保证。例如 bacedf$ 的 ,取偶数行样本,值为 的行要连续走过 才到样本值 ,共三步。更一般地,可让 个连续 SA 值都位于奇数行,采样行距固定为二,LF 仍需 步。保证来自文本位置的间隔,而非排序后行号的间隔。
区间收缩的数值核对
假设当前区间 ,要向左扩展字符 a,且 、、。新区间是 ,长度 2 正好等于原区间对应 BWT 片段中 a 的出现数 。这个长度守恒是排查端点错误最直接的断言。
逐字符搜索只得到 suffix-array 行区间;若要输出文本位置,需对每一行沿 LF 走到最近采样行。一个匹配很多的模式会产生 条定位路径,在 rank、LF 与样本查询均为常数成本时,时间可写成 ,而非把 count 的 误报为完整检索成本。
参考资料
- Paolo Ferragina, Giovanni Manzini, Opportunistic Data Structures with Applications, FOCS, 2000.
- Paolo Ferragina, Giovanni Manzini, Indexing Compressed Text, JACM, 2005.