最长的common subsequence problem是一个典型的计算机科学问题,解决它的算法是版本控制系统和维基引擎的根源。两个基本算法是用于创建diff
原始版本的Hunt–McIlroy algorithm和当前Myers diff algorithm使用的GNU diff utility。两者似乎都或多或少地通过在表示两个字符串或文本文件之间的编辑空间的图表中找到最短路径。编辑空间是将一个序列转换为另一个序列所需的插入或删除次数。那么Myer的diff算法和Hunt-McIlroy算法究竟有什么不同呢?
答案 0 :(得分:7)
迈尔斯算法是一种分而治之的算法"它通过递归查找具有最小编辑脚本的两个序列的中心匹配来工作。完成此操作后,只记忆匹配,并再次递归地比较它之前和之后的两个子序列,直到没有更多要比较的方式。找到中心匹配是通过尽可能匹配子序列的末端来完成的,并且在任何时候都不可能,将编辑脚本增加1,扫描每个对角线到达的最远位置,再看多远匹配可以去,如果匹配遇到另一端的匹配,算法才找到中心匹配。这种方法的优点是占用O(m + n)内存,并在 O(nd)中执行,使编辑脚本复杂化。
Hunt和McIlroy 方法计算整个文件中的匹配项,并将它们编入所谓的k-candidate。 k是LCS长度。 LCS通过找到属于适当纵坐标的匹配来逐步增加(遵循他们的论文中解释的规则)。在这样做时,每条路径都会被记忆。这种方法的问题在于它做的工作比必要的要多:它记忆所有路径,在最坏的情况下记忆 O(mn), o(mn log m)时间复杂度。
迈尔斯算法大多胜利,因为它在工作时不会记住路径,并且不需要预见"去哪里,这样做它可以随时集中在最小复杂度的编辑脚本可以到达的最远位置。这个"最小的复杂性"确保找到的是LCS,而不是记住它通过哪条路径,直到找到匹配使用更少的内存。不尝试提前计算所有匹配项会避免它们的存储,并使它们在匹配时获益,而不是记忆耗尽。