这是今天太平洋西北地区编程竞赛中出现的一个问题,在此期间没有人解决它。这是问题B,完整的问题集在这里:http://www.acmicpc-pacnw.org/icpc-statements-2011.zip。对于使用动态编程的两个字符串的LCS,存在众所周知的O(n ^ 2)算法。但是当这些字符串扩展到环时我不知道......
P.S。请注意,它是子序列而不是子字符串,因此元素不需要彼此相邻
P.S。它可能不是O(n ^ 2)而是O(n ^ 2lgn)或者可以在公共计算机上在5秒内给出结果的东西。
答案 0 :(得分:3)
在网上搜索,这似乎由Landau,Myers和Schmidt撰写的文章“增量字符串比较”的第4.3节以成本O(ne)< O(n ^ 2),我认为e是编辑距离。本文还引用了Maes的前一篇论文,给出了成本O(mn log m)的更一般的编辑成本 - “在循环字符串到字符串校正问题”。期待参赛者重现这些论文中的任何一篇对我来说都是非常苛刻的 - 但据我所知,这个问题确实要求循环字符串上最长的共同子序列。
答案 1 :(得分:1)
您可以将第一个和第二个字符串加倍,然后使用普通方法,然后将位置包裹起来。
答案 2 :(得分:1)
最好“加倍”字符串并应用标准的动态编程算法。它的问题在于,为了获得最佳循环LCS,必须“从多个初始条件启动算法”。只有一个初始条件(例如,在边界处将所有Lij变量设置为0)通常不会这样做。在实践中,事实证明所需的初始状态的数量是O(N)(它们跨越对角线),因此一个回到O(N ^ 3)算法。 然而,该方法确实具有一些优点,因为它可用于为CLCS设计有效的O(N ^ 2)启发式(不精确但接近精确)。
我不知道是否存在真正的O(N ^ 2),并且如果有人知道,则会非常感兴趣。 CLCS问题具有非常有趣的“周期性”特性:CLCS的长度 p次重新排列的字符串是字符串的CLCS的p倍。这可以通过采用问题的几何视图来证明。
此外,该问题还有一些额外的好处:可以证明,如果Lc(N)表示长度为N的两个随机串的CLCS长度的平均值,那么 | LC(N)-CN |是O(\ sqrt {N}),其中C是Chvatal-Sankoff的常数。对于标准LCS的平均长度L(N),我所知道的唯一速率结果是| L(N)-CN |是O(sqrt(Nlog N))。可能有一种比较Lc(N)和L(N)的好方法,但我不知道。
另一个问题:很明显,与LCS长度相反,CLCS长度不是超加性的。我的意思是,CLCS(X1X2,Y1Y2)总是大于CLCS(X1,Y1)+ CLCS(X2,Y2)(用计算机很容易找到反例)。 但似乎有可能平均长度Lc(N)是超加性的(Lc(N1 + N2)大于Lc(N1)+ Lc(N2)) - 尽管如果有证据我不知道它。 对这个问题的一个微不足道的兴趣是,N的前几个值的值Lc(N)/ N将为Chvatal-Sankoff常数提供良好的界限(远远好于L(N)/ N)。
答案 3 :(得分:1)
作为mcdowella答案的后续内容,我想指出Maes论文中提出的O(n ^ 2 lg n)解决方案是竞赛问题的预期解决方案(检查http://www.acmicpc-pacnw.org/ProblemSet/2011/solutions.zip)。 Landau等人的论文中的O(ne)解决方案不适用于这个问题,因为该论文的目标是编辑距离,而不是LCS。特别是,循环编辑距离的解决方案仅适用于编辑操作(添加,删除,替换)都具有单位(1,1,1)成本的情况。另一方面,LCS相当于用(添加,删除,替换)成本编辑距离(1,1,2)。这些并不相同;例如,考虑输入字符串“ABC”和“CXY”(对于非循环情况;您可以类似地构造循环反例)。两个字符串的LCS是“C”,但最小单位成本编辑是依次替换每个字符。
在110行,但没有复杂的数据结构,Maes的解决方案落在竞赛环境中合理实施的上端。即使Landau等人的解决方案可以适用于处理循环LCS,数据结构的复杂性也使其在竞赛环境中不可行。
最后但并非最不重要的是,我想指出CLCS存在O(n ^ 2)解决方案,如下所述:http://arxiv.org/abs/1208.0396 60行,没有复杂的数据结构,只有2个数组,这个解决方案在比赛设置中实施是非常合理的。但是,到达解决方案可能是另一回事。