“Suffix array保存后缀的字典序排列,是后缀树叶序的线性化,通常更紧凑但查询依赖二分、LCP 或额外索引。Suffix automaton压缩的是子串的右端等价类,识别全部子串语言;…”
形式陈述 ​
给定长度为
后缀自动机(suffix automaton, SAM)可定义为识别
非初态对应由等价关系划分出的子串
其中
:该类中最长子串长度; :最长子串的最长真后缀所在状态; - 按字符标记的确定转移。
该状态代表长度区间
中的若干子串,共贡献
个不同子串。
在线构造逐字符扩展当前最长前缀。若新增转移会让某状态同时承担不相容的长度结构,就克隆该状态:复制转移与 suffix link,调整 len,并重定向相关转移。长度
直觉
SAM 把“拥有相同未来出现位置”的子串合并。状态不是某一个字符串,而是一个等价类;因此 clone 不是复制一次真实出现,而是把原先合并过度的类按未来行为拆开。
名称中的“后缀”来自在线构造与 suffix link,不表示自动机只接受后缀。默认把所有可达状态设为接受时,它识别全部子串。若只把最终状态 last 及其 suffix-link 链上的状态标为接受,则同一转移图可识别
例子与边界
对 ababa,沿转移读取 bab 成功,因此它是子串;读取 baa 时缺失转移,因此拒绝。不同子串数为
要统计出现次数,可令每个新建非 clone 状态初值为 len 降序把计数累加到 suffix link。clone 不代表新结束位置,给它初值
最小性是相对于指定语言与自动机约定的。把缺失转移补成显式 sink,会比常见 SAM 实现多一个状态;把接受状态改成后缀集合,语言也从所有子串变为所有后缀。不能一边使用 partial-DFA 状态界,一边又暗中计入 sink。
推论与应用
SAM 可在线支持子串成员查询、不同子串计数、出现次数、最长公共子串和字典序第 endpos 出现次数不是路径数。
后缀树按前缀共享压缩后缀,后缀数组与 FM-index 围绕后缀序和 BWT 建立静态索引。SAM 按右上下文合并子串,不直接提供 suffix-array interval、locate 或文本提取接口;这些结构共享字符串对象,却保留不同信息。
参考资料
- Anselm Blumer et al., “The Smallest Automaton Recognizing the Subwords of a Text,” Theoretical Computer Science 40, 1985, 31–55.
- Maxime Crochemore and Wojciech Rytter, Jewels of Stringology, World Scientific, 2002, Chapter 5.
- Mehryar Mohri, “Finite-State Transducers in Language and Speech Processing,” Computational Linguistics 23(2), 1997, §2.
- OI-Wiki contributors, Suffix Automaton, OI-Wiki, accessed 2026.