Skip to content

定义Definition

词的共轭与循环移位

Conjugate words · Cyclic rotation of a word · Circular string · 词的旋转等价

把词切为 uv 再连接成 vu 定义旋转等价;本原根的长度决定不同旋转的个数和相同旋转起点的间隔。

同一个环形设备,第一次从状态 b 开始记录 bbaa,第二次从状态 a 开始记录 aabb。两份记录逐位置不同,却可能只是切开圆环的位置不同。要检查这种“同一圈”,应允许循环移位,而不是把字符排序:abab 与 aabb 的字符数量一样,绕圈次序却不同。

本页把切口变化写成精确关系,给出线性时间的等价检查,并解释为什么周期串会让多个起点对应同一个答案。

形式陈述 ​

切开前半段,接到后面 ​

长度为 n≥1 的字符串 s 在起点 k 的旋转定义为

rot(s,k)=s[k:n]s[0:k],0≤k<n.

若 s=uv、t=vu,就称 s,t 共轭。允许 u 或 v 为空,所以自身也属于共轭类。四个起点给 bbaa 的旋转依次为

bbaa,baab,aabb,abba.

旋转复合满足

rot(rot(s,i),j)=rot(s,(i+j)modn).

于是零位移给自反性,位移 n−k 撤销位移 k 给对称性,两次位移相加给传递性。共轭确实是一种等价关系。一个循环词可以看成这个等价类;显示给人或写进文件时,仍需选择其中一种线性表示。

空词只有它自己这一种表示,本页把它的共轭类定为 {ε}。公式里的模 n 只在非空时使用;实现不能为了沿用公式对零取模。

直觉

两倍串为什么包含所有旋转 ​

写出 ss。对每个 0≤k<n,长度为 n 的窗口

(ss)[k:k+n]

正好是从 s[k] 读到串尾,再从串首读到 s[k−1],也就是 rot(s,k)。反过来,任何起点小于 n 的这种窗口都对应一个合法切口。

因此等长非空词 s,t 共轭,当且仅当 t 出现在 ss 的某个起点 k<n。要避免起点 n 重复报告零起点,可以只搜索长度 2n−1 的文本 ss[0:2n−1]。使用KMP找一个出现或全部出现,预处理与扫描都是 O(n);模式的失败数组占 O(n) 个整数单元。

不一定要真正复制 ss。向匹配器提供第 i 个字符 s[imodn],依次供给 2n−1 个字符即可。这样省去双倍文本副本,但不减少读取次数,也不自动消除 KMP 的模式数组空间。

长度不同必须先拒绝。即使 ab 出现在 abababab 中,它也不是 abab 的旋转,因为绕完一圈的长度不同。若应用希望忽略重复圈数,应先比较本原根的循环表示,那是另一个明确不同的接口。

例子与边界

与后缀、反转的区别 ​

有限后缀 s[k:n] 走到串尾就停止,旋转则继续从头读取,直到恰好读完 n 个字符。例如 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。不同起点得到相同内容,来自原串本身的重复。

设 s=rm,r 是本原根,d=|r|,所以 n=md。那么:

  • 不同旋转恰有 d 种
  • 每种旋转恰由 m 个起点产生
  • 两个起点 i,j 给出同一旋转,当且仅当 i≡j(modd)

充分性直观:每走 d 个字符就是越过一整份重复块,读到的整圈没有变化。必要性需要排除另一种隐藏重复。

如果位移 k 保持整串不变,那么所有位置满足 s[i]=s[(i+k)modn]。在模 n 的位置上反复加 k,一个轨道恰好覆盖某个模 g=gcd(n,k) 的余数类,这里的 g 是最大公约数。因此同一模 g 类里的字符全相等,s 是长 g 前缀的 n/g 次幂。

唯一根定理说明 d∣g,进而 d∣k。对于一般的两个起点,先撤销其中一个位移,就回到刚证明的情形。由此得到准确的起点等价规则。

在 bbaabbaabbaa 中,本原根长四,所以只有四种不同旋转,每种由三个起点给出。最小内容 aabbaabbaabb 出现在 2,6,10,它们都同余于二模四。原始起点数十二、不同内容数四、每个内容的重数三,是三个不能混为一谈的计数。

参考资料
  • 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:线性时间循环规范化问题。
关系图谱12 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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