“给原文本追加唯一且全局最小的终止符 $$$,以下以 $T[0..n)$ 表示追加后的串,因此 $n\ge1$ 且长度包含终止符。目标输出后缀数组 $SA$,使 $T[SA[i]..]$ 按字…”
形式陈述
取有全序的字母表,字符串
直觉
后缀数组把一个字符串的所有后缀按字典序排列,并只保存起始位置。任意子串都是某个后缀的前缀;拥有共同模式前缀的后缀在数组中聚成连续区间,因此子串问题转为有序数组和区间问题,可用二分搜索。相邻后缀的公共前缀又由 LCP 数组压缩。相比后缀树,它表示紧凑、缓存友好,但查询需额外结构。
例子与边界
对附加最小且唯一终止符的 banana$,完整索引为:
| 后缀 | ||
|---|---|---|
| 0 | 6 | $ |
| 1 | 5 | a$ |
| 2 | 3 | ana$ |
| 3 | 1 | anana$ |
| 4 | 0 | banana$ |
| 5 | 4 | na$ |
| 6 | 2 | nana$ |
这里 ana$ 位于第 ana 时,下界与上界夹出
不同起点的有限后缀长度不同,本来就彼此不同。附加唯一终止符进一步保证没有一个后缀是另一个的前缀,并可统一构造边界;索引必须说明终止符是否计入长度。直接复制全部后缀需要
推论与应用
词、数组与字典序定义结构,LCP 数组另行支持公共前缀与重复子串查询。倍增、诱导排序等构造及其工作空间由后缀数组构造分层说明;本页只把构造结果当作索引对象。
Burrows–Wheeler 变换可由后缀序导出,压缩后缀数组用简洁结构减少显式
参考资料
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,§32.5 “Suffix Arrays”。
- Dan Gusfield, Algorithms on Strings, Trees, and Sequences, Cambridge University Press, 1997,§7.14 “Suffix Arrays — More Space Reduction”。