最长的共同子序列

时间:2010-06-09 05:53:32

标签: time-complexity dynamic-programming lcs

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

2 个答案:

答案 0 :(得分:8)

Gene Myers在1986年提出了一个非常好的算法,在这里描述:An O(ND) Difference Algorithm and Its Variations

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

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

答案 1 :(得分:1)

如果您事先了解了您所关心的最大大小 k 的上限,则可以通过在内部循环中添加额外的检查来强制LCS算法提前退出。这意味着当 k<< min(m,n)尽管您正在使用LCS,但您可以获得较少的运行时间。