Myers diff 算法与 Hunt–McIlroy 算法

问题描述 投票:0回答:1

最长的公共子序列问题是一个经典的计算机科学问题,解决它的算法是版本控制系统和wiki引擎的根源。

两种基本算法是 Hunt–McIlroy 算法(用于创建

diff
的原始版本)和 Myers diff 算法(当前由 GNU diff 实用程序 使用)。两者似乎都或多或少地通过通过表示两个字符串或文本文件之间的编辑空间的图形找到最短路径来工作。编辑空间是将一个序列转换为另一序列所需的插入或删除次数。那么 Myers 的 diff 算法和 Hunt–McIlroy 算法到底有什么区别呢?

algorithm diff lcs
1个回答
34
投票
  • 迈尔斯算法是一种“分而治之算法”:它的工作原理是使用最小的编辑脚本递归地查找两个序列的中心匹配。完成此操作后,仅记住匹配项,并再次递归比较其前后的两个子序列,直到没有更多内容可比较为止。找到中心匹配是通过尽可能匹配子序列的末端来完成的,只要不可能,就将编辑脚本增加 1,扫描每条对角线到达那里的每个最远位置,然后再看看有多远匹配可以走,如果一个匹配遇到另一端的匹配,算法就找到了中心匹配。这种方法的优点是占用 O(m+n) 内存,执行时间为 O(nd),d 为编辑脚本复杂度。

  • Hunt 和 McIlroy 方法计算整个文件中的匹配,并将它们索引到所谓的 k 候选中。 k是LCS长度。 LCS 通过寻找落在适当坐标内的匹配(遵循他们论文中解释的规则)来逐步增强。执行此操作时,每条路径都会被记住。这种方法的问题在于它做了比必要的更多的工作:它记住所有路径,在最坏的情况下O(mn)内存,以及o(mn log m)时间复杂度。

迈尔斯算法之所以获胜,是因为它在工作时不会记住路径,也不需要“预见”要去哪里,这样它就可以随时专注于用最小的编辑脚本可以到达的最远位置。复杂。这种“最小的复杂性”确保找到的是 LCS,并且在找到匹配项之前不会记住它所经过的路径,从而使用更少的内存。不尝试提前计算所有比赛可以避免存储它们,并使它们在比赛时受益而不是占用内存。

© www.soinside.com 2019 - 2024. All rights reserved.