“CFL 定理已经告诉我们, 必须分成 。但若不断创建字符串切片、比较整块、再把块合并,即使合并次数不多,也可能反复扫描同一批字符。”
banana 可以随意切成 ban|ana、b|an|ana 或六个单字符,但这些切法没有统一规则。若要求每块都是 Lyndon 词,并且从左到右不变大,切法就被固定为
这里 an 重复出现不构成问题:要求的是因子序列非增,允许相邻因子相等。这份切分既提供可检查的结构,也为线性扫描算法指定了唯一的目标。
形式陈述
定理与输出接口
固定字母表的全序。每个非空词
其中每个
算法可以输出各因子的半开区间,而不复制内容。banana 长六,区间是
也可以合并相邻相等因子,写成 anan 本身称为 Lyndon 因子。
直觉
从单字符开始,为什么总能得到一份
每个字符都是 Lyndon 词,因此先按单字符分割,已经满足“每块合法”。若相邻两块
只要还存在递增相邻对就继续合并。块数不能无限下降,所以过程终止;终止时不存在
这个论证还没有证明切法唯一,也没有保证任意合并实现都在线性时间完成。它只保证至少有一份合法结果。把“某个构造会终止”和“只有一个结果”分开,能避免在设计算法时偷用尚未证明的结论。
最后一块藏在全部后缀里
在任意合法分解
取一个非空后缀
如果
所以这种后缀严格更大。所有后缀都已覆盖,
例如 banana 的非空后缀是 banana,anana,nana,ana,na,a,最小的是最后的 a,因而任何合法分解都必须以这一块结束。移去它,对 banan 重复论证,最小后缀是 an;继续得到 ban 的 an,最后剩 b。
现在唯一性也清楚了:两份合法分解的末因子都必须是同一个最小后缀;删除它们后,剩余前缀仍有两份合法分解。按字符串长度归纳,所有前面的因子也逐一相同。无需猜测哪种合并顺序更“标准”,定理会强迫所有正确合并过程会合。
例子与边界
怎样检查别人交来的切分
给一组边界,先核验它们恰好覆盖输入且没有空块,再逐块检查 Lyndon 条件,最后检查相邻因子非增。三项全部通过,就可以凭唯一性确定这是正确 CFL 分解;检查器不必重演构造过程。
例如声称 abab 分成 ab|ab,三个条件都满足。声称分成整块 abab,覆盖虽正确,Lyndon 条件却失败;声称分成 a|b|a|b,每块都合法,但出现
用逐后缀比较核验每块,若块长为
CFL 不是“尽量使用最短块”,也不是“按字典序递增”。例如整串 aab 已是 Lyndon 词,它的唯一分解只有一块;分成 a|ab 虽每块合法,却递增。这个反例同时检验了顺序方向和唯一性条件。
单元中的一次完整核验
对 bbaabbaabbaa,分解为
切点是 aabb 已在上一页通过后缀判据,单字符自动合法,且
注意它的本原根是 bbaa,却没有任何 CFL 因子等于 bbaa。本原根要求整串由同一块重复,CFL 要求每个块是严格最小旋转且因子非增;两种分解回答不同的问题。下一页将对同一十二字符实例真正运行线性算法,把这份证书从“可验证”变成“可高效生成”。
推论与应用
一个容易理解、却还不够快的构造
存在性证明可以实现成栈。从左到右读字符,先把单字符作为新因子压入;如果栈顶两块递增,就合并,直到恢复非增顺序。
def cfl_by_merging(s):
factors = []
for ch in s:
factors.append(ch)
while len(factors) >= 2 and factors[-2] < factors[-1]:
right = factors.pop()
left = factors.pop()
factors.append(left + right)
return factors
读完每个前缀时,不变量有三条:栈里的块连接成这个前缀;每块都是 Lyndon 词;因子从底到顶非增。压入新字符只可能破坏最顶上的顺序,合并后也只需继续检查新相邻对,所以循环恢复全部不变量。
处理 banana 时,读到前两个字符得到 b|a;读到 n,合并 a|n 为 an;再读 a,n,同样形成第二个 an,但两个相等块不合并;最后的 a 保持在末尾。输出正是四块。
每次成功合并减少一个块,因此总合并次数至多
参考资料
- [1] K. T. Chen, R. H. Fox and R. C. Lyndon, “Free Differential Calculus, IV. The Quotient Groups of the Lower Central Series”, Annals of Mathematics 68(1), 1958, pp. 81–95,DOI。经典分解结果的原始来源。
- M. Lothaire, Combinatorics on Words, Cambridge University Press, 1997,Theorem 5.1.1 及 §5.1。
- Štěpán Holub and Štěpán Starosta, Lyndon Words, Archive of Formal Proofs,Lyndon factorization 的存在性、唯一性与后缀刻画。
- Jean-Pierre Duval, “Factorizing Words over an Ordered Alphabet”, Journal of Algorithms 4(4), 1983, pp. 363–381:避免朴素反复比较的线性分解算法。