“设非空词 $s$ 长度为 $n$,$p,q$ 是它的两个正周期,令 $d=\gcd(p,q)$ 为最大公约数。若”
录下一段设备日志,得到 abababa。它看起来按 ab 重复,但长度为七,末尾只留下半个 ab。如果把“有周期”解释成“由某一整块重复若干次”,这段日志就会被误判。有限字符串的周期允许最后一块没有录完;整块重复还要额外检查长度能否整除。
本页先把这两个问题分开,再说明为什么已经学过的前缀函数能够在线性时间找出最短周期。所有下标从零开始,切片
形式陈述
移动几格后,重叠部分仍然相同
设非空字符串
就称
对 abababa,a=a,b=b,a=a,b=b,a=a,全部通过。a 与 b,立即失败。把
一个周期不要求所有字符相同,也不要求
证明是反复减去
直觉
border 是同一份证据的另一种写法
长度
就称这段共同内容是一个真 border。这里允许 abababa 的非空 border 是 a、aba、ababa,长度分别为
周期公式可以直接改写成
右边恰好是长度
这是一一对应的数学关系,不是说“周期”和“border”是两个同义名。前者是位移长度,后者是重合内容;同一实例中的数值还互为补数。
对应关系立即给出最短周期:最长 border 留下的位移最短。若最长真 border 长为 abababa,最长 border 长五,最短周期便是二。
例子与边界
从周期到整块重复,还差哪一步
abababa 的最短周期是二,但它不是 ab 的整数次幂。abababab 则长八,可以写成
另一个容易混淆的例子是 abaaba:它有周期三和五,却没有周期
“有非空 border”也不等于“不是本原词”。aba 的 border 是 a,周期是二,但它不是任何更短非空串的整数次幂,仍是本原词。无 border 一定本原;反方向不成立。
本页把空字符串单独留在接口边界:没有 None,也可以按应用另定约定,但不能直接读取
手算检查与迁移
给定 abcabca,先不用算法逐项检查 abca;其最长 border 也为四,所以最短周期是三。abc。
现在把记录改为 abcabc。最短周期仍为三,但长度变为六,于是确实是两个 abc。这两条记录可能来自同一循环设备,只是截取长度不同:周期识别负责找重复规律,本原根识别负责找整块分解,循环串规范化还要处理从哪个位置开始记录。后三个问题会在后续页面逐步分开解决。
推论与应用
用已经算过的重合信息求周期
前缀函数
例如 abababa 的数组是
要列出全部周期,可以顺着 border 链走:先输出
Z 函数提供另一种检查方式。对
构造前缀函数或 Z 数组需 aaaa,所以报告全部答案本来就可能需要线性输出。字符若是大型对象,须把一次相等比较的实际代价乘进去。
参考资料
- M. Lothaire, Combinatorics on Words, Cambridge University Press, 1997,§1.3 “Conjugacy and periodicity”:有限词的周期、border 与幂。本文的两个日志实例独立构造。
- Dan Gusfield, Algorithms on Strings, Trees, and Sequences, Cambridge University Press, 1997,第1章:前缀重合的线性预处理。
- Štěpán Holub, Martin Raška and Štěpán Starosta, Combinatorics on Words Basics, Archive of Formal Proofs, 2021;CoWBasic、Border_Array:border、周期与根的形式化接口。