“词、数组与字典序定义结构,LCP 数组另行支持公共前缀与重复子串查询。倍增、诱导排序等构造及其工作空间由后缀数组构造分层说明;本页只把构造结果当作索引对象。”
输入约定与输出 ​
给文本
字符必须有固定全序。线性整数算法通常进一步要求字母表已编码为
终止符既让所有后缀互异,也为越过文本末尾的排名提供统一最小哨兵。若输入本身可能含 $,必须先重编码或选择域外符号。
Doubling:按 前缀细化秩 ​
初始按单字符给每个后缀排名
完全决定;越界的第二项记为
每轮覆盖长度翻倍,共
banana$ 的两轮轨迹 ​
对 banana$,按字符序 $ < a < b < n 取秩,初始
排序长度
其中起点 an,起点 na,仍共享秩。再按长度
所有秩已唯一,对应 $,a$,ana$,anana$,banana$,na$,nana$。这个轨迹展示“排序完整后缀”被有限整数秩对替代。
DC3/Skew 的差分覆盖 ​
DC3 把起点按模
若抽出的三字符元组排名仍不唯一,就递归排序缩短后的秩串。每层总输入规模按常数比例缩小,bucket 操作为线性,因而在整数 Word-RAM 模型中得到
稳定排序是证明的一部分:相同前缀键必须保留用于下一关键字的既有次序。把 DC3 的线性归并换成任意字符串比较,会重新引入长前缀扫描。
SA-IS 的诱导排序 ​
SA-IS 从右向左把位置分成 S-type 与 L-type,并选取从 L 到 S 转折的 LMS 位置。先按首字符 bucket 放置 LMS 后缀,再从已放位置诱导 L 后缀、反向诱导 S 后缀。
相邻 LMS 子串被命名成新整数串;若名称不唯一,就递归求这个更短串的后缀数组,再按所得 LMS 次序执行最终诱导。LMS 数至多约
“S/L 类型”取决于后缀字典序而不只取决于相邻字符;相等字符时类型继承右邻。分类或 bucket 端点错一位,会让诱导阶段静默丢失后缀。
模型与算法选择 ​
Doubling 结构简单,易复用稳定整数排序;DC3 与 SA-IS 达到理论线性,却有更复杂的递归、bucket 与工作区管理。线性界不表示它们在所有输入规模上更快。
任意比较字母表至少要付出建立字符秩和比较信息的成本。若字符是长对象或 locale-sensitive 字符串,先把它们压成整数也可能需要
输出
失败边界与相邻结构 ​
直接物化每个后缀再比较会产生
LCP 数组、BWT与FM-index以构造好的后缀序为输入或邻近结构,不属于 SA 构造步骤本身。在线文本追加也会改变大量后缀次序,静态构造算法不能局部套用。
参考资料
- Udi Manber and Gene Myers, “Suffix Arrays: A New Method for On-Line String Searches,” SIAM Journal on Computing 22(5), 1993.
- Juha Kärkkäinen and Peter Sanders, “Simple Linear Work Suffix Array Construction,” ICALP, 2003.
- Ge Nong, Sen Zhang, and Wai Hong Chan, “Linear Suffix Array Construction by Almost Pure Induced-Sorting,” DCC, 2009.