Skip to content

后缀数组

Suffix array

按字典序排列字符串全部后缀起始位置的数组索引。

条目类型
模型

形式陈述

字符串 T 长度为 n,后缀数组 SA[0..n1] 是起始位置的排列,使后缀 T[SA[i]..] 按字典序非降排列;逆后缀数组 ISA[p] 给起点 p 的后缀在 SA 中的秩。以模式 P 为前缀的后缀形成连续区间,可分别二分其字典序下界与上界。若每次后缀比较最多检查 |P| 个字符,查询最坏为 O(|P|logn),再加输出 occurrence 的成本。

直觉

后缀数组把一个字符串的所有后缀按字典序排列,并只保存起始位置。任意子串都是某个后缀的前缀;拥有共同模式前缀的后缀在数组中聚成连续区间,因此子串问题转为有序数组和区间问题,可用二分搜索。相邻后缀的公共前缀又由 LCP 数组压缩。相比后缀树,它表示紧凑、缓存友好,但查询需额外结构。

字典序后缀与模式区间
例子与边界

对附加最小且唯一终止符的 banana$,完整索引为:

i SA[i] 后缀
0 6 $
1 5 a$
2 3 ana$
3 1 anana$
4 0 banana$
5 4 na$
6 2 nana$

这里 ISA[3]=2,因为 ana$ 位于第 2 个秩;搜索模式 ana 时,下界与上界夹出 SA[2..4)={3,1}。终止符小于其他字符且只出现一次,可统一前缀比较约定,但并非所有实现必需。相邻后缀的 LCP 值在本例为 [0,0,1,3,0,0,2],它是由后缀序导出的独立数组,不属于 SA/ISA 定义,也不自动附带区间最值结构。

必须明确是否附加全局最小终止符;它能保证所有后缀不同并简化构造。直接存完整后缀并排序会产生 O(n2) 数据和比较成本,倍增或 SA-IS 等算法利用排名避免这一退化。

推论与应用

数组字典序定义结构,LCP 数组另行支持公共前缀与重复子串查询。倍增、诱导排序等构造及其工作空间由后缀数组构造分层说明;本页只把构造结果当作索引对象。

Burrows–Wheeler 变换可由后缀序导出,压缩后缀数组用简洁结构减少显式 SA 空间,FM-index则在 BWT 上提供 backward search 与采样定位。它们分别改变表示和查询成本,不应被压成“后缀数组的一个实现细节”。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Parts I–VI。
  • Dan Gusfield, Algorithms on Strings, Trees, and Sequences, Cambridge University Press, 1997,Chs. 1–8。
关系图谱13 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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