2017-03-06 119 views
0

最长的common subsequence problem是一个经典的计算机科学问题,解决它的算法是版本控制系统和wiki引擎的根源。两种基本算法是Hunt–McIlroy algorithm,它用于创建diff的原始版本,以及Myers diff algorithm,它由GNU diff utility当前使用。两者似乎都或多或少地通过找到表示两个字符串或文本文件之间的编辑空间的图表的最短路径。编辑空间是将一个序列转换为另一个序列所需的插入或删除次数。那么Myer的差异算法和Hunt-McIlroy算法究竟有什么区别呢?Myers diff算法vs Hunt-McIlroy算法

回答

1
  • 迈尔斯算法是“分而治之算法”:它的工作原理是寻找递归两个序列的中央配以最小的编辑脚本。一旦完成,只有匹配被记住,并且递归地比较它之前和之后的两个子序列,直到没有其他要比较的东西。通过尽可能地匹配子序列的末端来找到中心匹配,并且在任何时候不可能的情况下,通过将编辑脚本增加1来扫描每个对角线到达那里的每个最远位置并且再次看到多远比赛可以去,如果一场比赛遇到另一端的比赛,该算法刚刚发现中央匹配。这种方法具有占用O(m + n)存储器的优点,并且在执行编辑脚本复杂度时执行。

  • 亨特和麦克罗伊方法计算匹配整个文件,并将它们索引到所谓的k候选。 k是LCS长度。 LCS通过找到属于正确坐标的匹配来逐步增加(遵循他们的论文中的规则)。这样做的每条路都被记住。这种方法存在的问题是,它的工作量超过了必要的:它记录了所有的路径,在最坏的情况下存储所有的路径,并且在时间复杂度方面存储所有的路径和o(mn log m)

迈尔斯算法主要是赢,因为它没有记忆,而工作路径,并不需要“预见”到哪儿去,这样就可以在任何时间只在它可能到达的最远位置集中用最小复杂度的编辑脚本。这个“最小的复杂性”确保找到的是LCS,而不是记住它通过哪条路径,直到找到匹配使用更少的内存为止。不要试图提前计算所有匹配,以避免他们的存储,并使他们在比赛时间而不是记忆猪。