考虑2个序列X [1..m]和Y [1..n]。记忆算法将在时间O(m * n)内计算LCS。有没有更好的算法来找出LCS时间?我想对角完成的memoization可以给我们O(min(m,n))时间复杂度。
答案 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,但您可以获得较少的运行时间。