考虑2个序列X [1..M]和Y [1..N]。所述记忆化算法将计算在时间为O的LCS(m * n个)。有没有更好的算法来找出LCS WRT时间?我想记忆化斜做可以给我们O(分钟(M,N))的时间复杂度。

有帮助吗?

解决方案

基因迈尔斯于1986年提出了一个非常漂亮的算法对于这一点,说明如下:的的O(ND)差分算法及其版本

此算法需要时间正比于序列之间的编辑距离,所以它的速度要快得多,当差是小的。它通过遍历所有可能的编辑距离,从0开始,直到它找到它的编辑脚本(在某些方面的双重的LCS)的可构建的距离。这意味着,可以通过“拯救早”如果该差增大高于某个阈值,这有时是方便的。

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

其他提示

如果你知道先验的上界的最大大小ķ你所关心的,可以早期通过添加在内部循环的额外的检查强制LCS算法退出。这意味着然后当ķ<<分钟(M,N)可以尽管你正在做的LCS的事实得到小的运行时间。

是的,我们能比订单O(m * n个)创建一个更好的算法--- 即O(分钟(M,N))。找到一个长度..... 只是比较对角线elements.and每当增量完成假设在C发生[2,2]然后从C [2,2 ++]和c递增的所有值[2 ++,2]通过1 .. 并继续直到C [M,M] ..(假设米     

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top