Skip to content

模型Model

FM-index

施工中 · 内容逐步修订

FM-index · Full-text minute-space index

在压缩 BWT 上提供 rank 支持,以反向搜索完成模式计数,并通过采样后缀数组和逆后缀数组实现定位与文本提取。

形式陈述 ​

文本、端点与核心存储 ​

设文本

T[0..n−1]∈Σn−1$

其中 n≥1,唯一哨兵 $ 不属于 Σ,且小于其他字符。令 L=BWT(T) 为Burrows–Wheeler 变换。FM-index 的核心不保存 suffix array 全表,而保存:

  • C[c]:文本中严格小于字符 c 的字符数;
  • rankc(L,i):半开前缀 L[0..i) 中 c 的出现次数;
  • 支持上述 rank 的简洁位向量或 Wavelet Tree。

这里的字符 rank 推广了位串上的rank/select 接口:rankc 等于指示串 [L[j]=c] 的 rank-one。所有公式采用半开端点。若把 rank 改成闭前缀,C 和区间更新必须一起调整;只改一个端点会造成系统性的 off-by-one。

backward search 与 count ​

查询模式 P∈Σ∗ 不含哨兵。后缀数组中,以 P 为前缀的后缀形成连续区间 [l,r)。初始空模式对应 [0,n)。从 P 的末字符向前处理,若当前区间表示后缀 Q,向左加入 c 后

l′=C[c]+rankc(L,l),r′=C[c]+rankc(L,r).

first–last correspondence保证新区间正好对应前缀 cQ。若 l′≥r′,模式不存在;处理完全部 |P| 个字符后,出现次数为 r−l。

把一次 rank 和 C[c] 访问的成本合计记作 trank≥1,count 时间为

O(1+|P|trank),

与输出出现数无关。使用平衡 wavelet tree 时 trank=O(1+log⁡σ),其中 σ 计入哨兵;常数字母表可分别存字符指示位向量,取得常数 rank。模式含原文未出现的字符时直接返回零;空模式则返回 n 个原文边界。必须让时间界与所选字母表表示配套。

直觉

模式的所有出现对应后缀数组中的一个连续区间。BWT 的 first–last 对应让“在模式左边再接一个字符”变成两次 rank 更新,因此查询可以从模式末尾向前逐字符收紧区间;采样 SA/ISA 则为区间中的行补回文本坐标,形成 count、locate 与 extract 的不同成本。

FM-index 的计数核心
例子与边界

具体例子:在 banana$ 中搜索 ana ​

T=banana$ 的 BWT 为

L=annb$aa.

字符累计数满足 C[a]=1,C[b]=4,C[n]=5。从 [0,7) 开始反向处理:

a:[1,4),n:[5,7),a:[2,4).

最终区间长度为 2,所以 ana 出现两次。这个过程只访问 BWT 的 rank,没有扫描原文,也没有保存完整 suffix array。

locate 为什么还要采样 ​

Count 只返回 suffix-array 区间;要得到每一行对应的文本位置,需要 suffix array 值。选整数采样步长 1≤s≤n,保存所有 SA[i]≡0(mods) 的行及其 SA 值。这里按文本位置采样,不是按每第 s 个后缀行采样。LF 映射满足

SA[LF(i)]=SA[i]−1(modn).

以标记位向量指出哪些行有样本,并用该标记上的 rank 定位紧凑样本数组。从待定位行反复做 LF,至多 s−1 步命中样本,再把步数加回并模 n 即可恢复位置。令 tLF≥1 包括读取 L[i]、字符 rank、C 访问与样本查询,则定位一个 occurrence 的时间为

O(stLF),

样本值占 O(⌈n/s⌉log⁡(n+1)) bits,另计样本标记索引。稠密标记可用 n+o(n) 位,稀疏压缩标记则有不同的空间式;这部分不能藏进样本值的界里。报告全部 occ 个位置的定位成本为

O(occ⋅stLF).

调大 s 节省空间却减慢 locate。不能把 count 的 O(|P|trank) 直接写成所有查询操作的时间。

extract 与自索引含义 ​

提取合法区间 0≤p≤p+ℓ≤n 时,空区间直接返回;非空区间通常再按步长 sISA 采样 inverse suffix array。固定 1≤sISA≤n,先从不超过 p 的最近采样位置 q=sISA⌊p/sISA⌋ 取得 BWT 行,再用 Ψ=LF−1 或等价 select 操作逐字符向前,时间包含至多一个采样间隔和输出长度:

O((sISA+ℓ)tstep).

“自索引”表示原文可以由索引恢复,因此最终存储可不另放一份未经压缩的 T;它不表示任意文本位置都免费 O(1) 随机访问。若用上述采样取得快速 locate 与 extract,就须把两张样本表及各自间隔一并报告;仅能逐步恢复整个原文的表示,并不自动具有这些访问时间。

推论与应用

空间界的条件 ​

空间界依赖具体的 BWT 编码。一个明确例子是 Alphabet-Friendly FM-index:固定字母表大小 σ≥2 和常数 0<α<1,对整数 0≤k≤αlogσ⁡n,通过上下文分块与压缩 wavelet 结构,可把 BWT 导航部分保存在

nHk(T)+o(n)

位内,并支持常数时间字符 rank。这里 Hk 使用该定理的有限文本、后继上下文约定;普通全局零阶压缩只保证相应的 H0 界。上面的任意 SA/ISA 采样方案还须另加样本值、标记索引和字母表元数据,尤其稠密样本标记的 n 位不能计作 o(n)。要取得完整自索引的同阶熵空间,须同时采用定理中的稀疏采样与标记表示。

高度可压缩文本会让主体显著小于 nlog⁡σ,但随机文本的经验熵接近该上限。构建阶段常需 suffix array、BWT 工作区和外部排序,峰值内存可以远高于最终索引;最终空间界不是构建内存保证。

失败边界与近邻概念 ​

单次字符串匹配可用 KMP 在 O(n+|P|) 扫描文本;FM-index 的价值在于固定文本上的大量模式查询和压缩存储。若只查询一次,建立索引未必划算。

哨兵必须唯一,字符序固定,rank 端点从建表到 backward search 保持一致。动态插入文本会整体改变 BWT 行次序,静态 FM-index 不能局部套用普通数组插入。近似匹配、通配符和正则查询还会分裂为许多区间,复杂度不再只是 O(|P|trank)。

参考资料
  • 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:上下文分块、秩查询和采样的完整空间核算;本文取固定字母表特例。

关系图谱12 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系