形式陈述
文本、端点与核心存储
设文本
其中 ,唯一哨兵 不属于 ,且小于其他字符。令 为Burrows–Wheeler 变换理路Burrows–Wheeler 变换Burrows-Wheeler transform · BWT对带唯一终止符文本的循环移位排序,并取最后一列形成可逆排列。。FM-index 的核心不保存 suffix array 全表,而保存:
- :文本中严格小于字符 的字符数;
- :半开前缀 中 的出现次数;
- 支持上述 rank 的简洁位向量理路简洁位向量succinct bit vector · rank-select bit vector以 n+o(n) 位表示静态位串,并在 Word-RAM 上常数时间支持 rank 与 select。或 Wavelet Tree理路Wavelet Treewavelet tree · 小波树递归划分有序字母表,并用节点位向量映射序列位置以支持 access、rank、select 与区间选择。。
这里的字符 rank 推广了位串上的rank/select 接口理路Rank 与 Select 查询Rank and select在位串上计算前缀频数或定位第 j 次出现,并固定端点和索引约定。: 等于指示串 的 rank-one。所有公式采用半开端点。若把 rank 改成闭前缀, 和区间更新必须一起调整;只改一个端点会造成系统性的 off-by-one。
backward search 与 count
查询模式 不含哨兵。后缀数组中,以 为前缀的后缀形成连续区间 。初始空模式对应 。从 的末字符向前处理,若当前区间表示后缀 ,向左加入 后
first–last correspondence理路LF 映射与反向搜索LF mapping · FM-index backward search借 BWT 的同字符稳定对应,把模式从右向左扩展为后缀数组区间。保证新区间正好对应前缀 。若 ,模式不存在;处理完全部 个字符后,出现次数为 。
把一次 rank 和 访问的成本合计记作 ,count 时间为
与输出出现数无关。使用平衡 wavelet tree 时 ,其中 计入哨兵;常数字母表可分别存字符指示位向量,取得常数 rank。模式含原文未出现的字符时直接返回零;空模式则返回 个原文边界。必须让时间界与所选字母表表示配套。
直觉
模式的所有出现对应后缀数组中的一个连续区间。BWT 的 first–last 对应让“在模式左边再接一个字符”变成两次 rank 更新,因此查询可以从模式末尾向前逐字符收紧区间;采样 SA/ISA 则为区间中的行补回文本坐标,形成 count、locate 与 extract 的不同成本。
FM-index 的计数核心
例子与边界
具体例子:在 banana$ 中搜索 ana
的 BWT 为
字符累计数满足 。从 开始反向处理:
最终区间长度为 ,所以 ana 出现两次。这个过程只访问 BWT 的 rank,没有扫描原文,也没有保存完整 suffix array。
locate 为什么还要采样
Count 只返回 suffix-array 区间;要得到每一行对应的文本位置,需要 suffix array 值。选整数采样步长 ,保存所有 的行及其 SA 值。这里按文本位置采样,不是按每第 个后缀行采样。LF 映射满足
以标记位向量指出哪些行有样本,并用该标记上的 rank 定位紧凑样本数组。从待定位行反复做 LF,至多 步命中样本,再把步数加回并模 即可恢复位置。令 包括读取 、字符 rank、 访问与样本查询,则定位一个 occurrence 的时间为
样本值占 bits,另计样本标记索引。稠密标记可用 位,稀疏压缩标记则有不同的空间式;这部分不能藏进样本值的界里。报告全部 occ 个位置的定位成本为
调大 节省空间却减慢 locate。不能把 count 的 直接写成所有查询操作的时间。
提取合法区间 时,空区间直接返回;非空区间通常再按步长 采样 inverse suffix array。固定 ,先从不超过 的最近采样位置 取得 BWT 行,再用 或等价 select 操作逐字符向前,时间包含至多一个采样间隔和输出长度:
“自索引”表示原文可以由索引恢复,因此最终存储可不另放一份未经压缩的 ;它不表示任意文本位置都免费 随机访问。若用上述采样取得快速 locate 与 extract,就须把两张样本表及各自间隔一并报告;仅能逐步恢复整个原文的表示,并不自动具有这些访问时间。
推论与应用
空间界的条件
空间界依赖具体的 BWT 编码。一个明确例子是 Alphabet-Friendly FM-index:固定字母表大小 和常数 ,对整数 ,通过上下文分块与压缩 wavelet 结构,可把 BWT 导航部分保存在
位内,并支持常数时间字符 rank。这里 使用该定理的有限文本、后继上下文约定;普通全局零阶压缩只保证相应的 界。上面的任意 SA/ISA 采样方案还须另加样本值、标记索引和字母表元数据,尤其稠密样本标记的 位不能计作 。要取得完整自索引的同阶熵空间,须同时采用定理中的稀疏采样与标记表示。
高度可压缩文本会让主体显著小于 ,但随机文本的经验熵接近该上限。构建阶段常需 suffix array、BWT 工作区和外部排序,峰值内存可以远高于最终索引;最终空间界不是构建内存保证。
失败边界与近邻概念
单次字符串匹配理路字符串匹配String matching · Exact pattern matching在文本中定位模式串全部出现位置的问题。可用 KMP 在 扫描文本;FM-index 的价值在于固定文本上的大量模式查询和压缩存储。若只查询一次,建立索引未必划算。
哨兵必须唯一,字符序固定,rank 端点从建表到 backward search 保持一致。动态插入文本会整体改变 BWT 行次序,静态 FM-index 不能局部套用普通数组插入。近似匹配、通配符和正则查询还会分裂为许多区间,复杂度不再只是 。
参考资料
-
Paolo Ferragina and Giovanni Manzini, “Opportunistic Data Structures with Applications,” FOCS, 2000.
-
Paolo Ferragina and Giovanni Manzini, “Indexing Compressed Text,” Journal of the ACM 52(4), 2005, 552–581.
-
Veli Mäkinen et al., Genome-Scale Algorithm Design, Cambridge University Press, 2015, compressed full-text indexes chapter.
-
Paolo Ferragina, Giovanni Manzini, Veli Mäkinen and Gonzalo Navarro, “Compressed Representations of Sequences and Full-Text Indexes”, ACM Transactions on Algorithms 3(2), 2007,§§4.4–4.5 与 Theorem 4.3:上下文分块、秩查询和采样的完整空间核算;本文取固定字母表特例。