【问题标题】:Longest Common Subsequence最长公共子序列
【发布时间】:2011-03-01 12:13:25
【问题描述】:

考虑 2 个序列 X[1..m] 和 Y[1..n]。记忆算法将在 O(m*n) 时间内计算 LCS。有没有更好的算法来找出 LCS wrt time?我猜对角线的记忆可以给我们 O(min(m,n)) 时间复杂度。

【问题讨论】:

标签: time-complexity dynamic-programming lcs


【解决方案1】:

Gene Myers 在 1986 年为此提出了一个非常好的算法,如下所述:An O(ND) Difference Algorithm and Its Variations

该算法所花费的时间与序列之间的编辑距离成正比,因此当差异较小时它会快得多。它通过循环所有可能的编辑距离来工作,从 0 开始,直到找到可以构造编辑脚本(在某些方面是 LCS 的对偶)的距离。这意味着,如果差异超过某个阈值,您可以“提前退出”,这有时很方便。

我相信这个算法仍然在许多diff 实现中使用。

【讨论】:

  • 不知道为什么 url 对我来说似乎损坏了,说“我们很抱歉!该 URL 与我们存储库中的任何资源都不匹配。”
【解决方案2】:

如果您事先知道您关心的最大大小k 的上限,则可以通过在内部循环中添加额外检查来强制 LCS 算法提前退出。这意味着当 k 时,尽管您正在执行 LCS,但您可以获得较小的运行时间。

【讨论】:

    【解决方案3】:

    是的,我们可以创建比 Order O(m*n) 更好的算法--- 即 O(min(m,n))。找到一个长度...... 只需比较对角元素。每当增量完成时,假设它发生在 c[2,2] 中,然后将 c[2,2++] 和 c[2++,2] 中的所有值增加 1.. 并继续直到 c[m,m]..(假设 m

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多