【问题标题】:O(n^2) (or O(n^2lg(n)) ?)algorithm to calculate the longest common subsequence (LCS) of two 'ring' stringO(n^2)(或 O(n^2lg(n)) ?)算法计算两个“环”字符串的最长公共子序列 (LCS)
【发布时间】:2011-12-22 22:38:29
【问题描述】:

这是今天太平洋西北地区编程竞赛中出现的一个问题,没有人解决它。这是问题 B,完整的问题集在这里:http://www.acmicpc-pacnw.org/icpc-statements-2011.zip。有一个众所周知的 O(n^2) 算法用于使用动态编程的两个字符串的 LCS。但是当这些字符串扩展到环时我不知道......

附:注意它是子序列而不是子字符串,所以元素不需要彼此相邻

附:它可能不是 O(n^2) 而是 O(n^2lgn) 或者在普通计算机上可以在 5 秒内给出结果的东西。

【问题讨论】:

  • 您确定存在 O(n^2) 算法吗?他们说“大”箱子只有1500个字母。 1500^3 大约只有 33 亿,这在快速机器上应该不会花太长时间......但是 O(n^3) 有点微不足道
  • @Nemo 好吧,我确信 O(n^3) 算法不会这样做,因为时间限制是 5 秒。它可能是 O(n^2log(n)) 或其他东西

标签: string algorithm dynamic-programming


【解决方案1】:

你可以将第一个和第二个字符串加倍,然后使用普通方法,然后将位置环绕。

【讨论】:

  • 我一开始尝试过,但是如果原始字符串重叠,那么当你将它们加倍时,这个 LCS 也会加倍。而且它可能会变得复杂......我也尝试计算一个字符串的LCS和另一个字符串的双精度,但它有类似的问题
  • @dementrock:我不明白,你能显示示例字符串吗?
  • 例如(在问题中)“megamind”和“mindmega”,当你简单地把它加倍时,你会得到“megamindmegamind”和“mindmegamindmega”,在这种情况下LCS的长度是l2 ! ("megamindmega") (我没仔细算过但还是反例)
  • 对于我尝试过的方法,采用“metrocity”和“kryptonite”(我忘了提到字符串也可以恢复,但这对算法来说并不重要)。将其中一个加倍,例如“metrocity”和“etinotpyrketinotpyrk”,在这种情况下,LCS 的长度大于或等于 6(“etroty”),但原始 LCS 是“etoty”
  • @Dani 同样它是一个子序列而不是一个子字符串。所以它是 B[A]CD[B]A[CD]
【解决方案2】:

在网上搜索,Landau、Myers 和 Schmidt 的论文“增量字符串比较”的第 4.3 节似乎涵盖了这一点,成本为 O(ne)

【讨论】:

  • 谢谢! (嗯,我看到这确实是一个难题,我在比赛期间花了很多时间..)
【解决方案3】:

最好将字符串“加倍”并应用标准动态规划算法。问题在于,要获得最佳循环 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 好得多)。

【讨论】:

    【解决方案4】:

    作为 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”,但最小的单价编辑是依次替换每个字符。

    Maes 的解决方案只有 110 行,但没有复杂的数据结构,属于在竞赛环境中合理实施的上限。即使 Landau 等人的解决方案可以适应循环 LCS,但数据结构的复杂性使其在竞赛环境中不可行。

    最后但同样重要的是,我想指出,CLCS 确实存在 O(n^2) 解决方案,如下所述:http://arxiv.org/abs/1208.0396 60 行,没有复杂的数据结构,只有 2 个数组,这解决方案在比赛环境中实施是相当合理的。不过,找到解决方案可能是另一回事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      相关资源
      最近更新 更多