“对非空输入 $s$,在它的全部循环移位中定义”
同一个环形设备,第一次从状态 b 开始记录 bbaa,第二次从状态 a 开始记录 aabb。两份记录逐位置不同,却可能只是切开圆环的位置不同。要检查这种“同一圈”,应允许循环移位,而不是把字符排序:abab 与 aabb 的字符数量一样,绕圈次序却不同。
本页把切口变化写成精确关系,给出线性时间的等价检查,并解释为什么周期串会让多个起点对应同一个答案。
形式陈述
切开前半段,接到后面
长度为
若 bbaa 的旋转依次为
旋转复合满足
于是零位移给自反性,位移
空词只有它自己这一种表示,本页把它的共轭类定为
直觉
两倍串为什么包含所有旋转
写出
正好是从
因此等长非空词
不一定要真正复制
长度不同必须先拒绝。即使 ab 出现在 abababab 中,它也不是 abab 的旋转,因为绕完一圈的长度不同。若应用希望忽略重复圈数,应先比较本原根的循环表示,那是另一个明确不同的接口。
例子与边界
与后缀、反转的区别
有限后缀 baab 的最小非空后缀是 aab,从同一起点一开始确实也得到最小旋转 aabb,但这只是一例巧合。baa 的最小后缀是最后一个 a,该起点的旋转是 aba;真正最小旋转是从前一个 a 开始的 aab。
因此不能把后缀数组的第一项直接当成最小旋转起点。BWT把全部循环移位排序,接入唯一最小终止符后可以和后缀排序对应;这里的终止符承担了固定边界的作用,不能擅自删去这个条件。
本页的旋转不允许倒着读。abc 的旋转只有 abc,bca,cab,不包含 acb。项链若允许翻面,或者几何轮廓若不区分顺逆方向,还要额外把反转纳入等价关系;直接使用本页的共轭检查会保留方向信息,这通常正是日志所需要的。
手算终点
检查 aabb 是否与 bbaa 共轭:在 bbaabbaa 中找到长四窗口,起点二给出 aabb,证据是切分 bb|aa 变成 aa|bb。
再检查 abab 与 aabb。两者长度相同、字符计数相同,却没有任何合法窗口相等。abababab 的长四窗口只能是 abab 或 baba,因此拒绝。最后解释为什么 abab 的本原根长二,正好与两种不同窗口内容一致。
这些证据都是可以独立检查的:接受时给起点和一次切分;拒绝时可以给出完整匹配扫描的结果。接下来,Lyndon 词会在本原共轭类中选一个唯一的最小代表,最小旋转算法则处理包括非本原词在内的一般输入。
推论与应用
有 n 个起点,未必有 n 种表示
abab 的四次旋转是 abab,baba,abab,baba。不同起点得到相同内容,来自原串本身的重复。
设
- 不同旋转恰有
种 - 每种旋转恰由
个起点产生 - 两个起点
给出同一旋转,当且仅当
充分性直观:每走
如果位移
唯一根定理说明
在 bbaabbaabbaa 中,本原根长四,所以只有四种不同旋转,每种由三个起点给出。最小内容 aabbaabbaabb 出现在
参考资料
- M. Lothaire, Combinatorics on Words, Cambridge University Press, 1997,§1.3:共轭、周期与本原性。
- Yossi Shiloach, “Fast Canonization of Circular Strings”, Journal of Algorithms 2(2), 1981, pp. 107–121:循环串及多个最小起点的结构。本文未使用该文更精细的比较次数界。
- K. S. Booth, “Lexicographically Least Circular Substrings”, Information Processing Letters 10(4–5), 1980, pp. 240–242:线性时间循环规范化问题。