首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Myers diff算法与Hunt-McIlroy算法

Myers diff算法与Hunt-McIlroy算法
EN

Stack Overflow用户
提问于 2017-03-06 21:27:54
回答 1查看 8.4K关注 0票数 20

最长的公共子序列问题是一个经典的计算机科学问题,解决它的算法是版本控制系统和wiki引擎的根源。两种基本算法是用于创建Hunt-McIlroy算法原始版本的diff和当前由GNU diff实用程序使用的Myers diff算法。两者似乎或多或少都是通过在表示两个字符串、或文本文件之间的编辑空间的图形中找到最短路径来工作的。编辑空间是将一个序列转换为另一个序列所必需的插入或删除的数量。那么,Myer的diff算法和Hunt-McIlroy算法到底有什么区别呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-11 22:45:25

  • Myers算法是一种“分而治之的算法”:它通过递归查找两个序列的中心匹配和最小的编辑脚本来工作。一旦完成这一操作,匹配就会被记忆,然后再递归地比较它前面和后面的两个子序列,直到没有更多的比较。寻找中心匹配是通过尽可能匹配子序列的末端来完成的,在任何不可能的情况下,增加编辑脚本1,扫描每个对角线到那里的每个最远的位置,看看再匹配的距离有多远,如果匹配遇到另一端的匹配,算法就会找到中心匹配。该方法具有占用O(m+n)内存的优点,在O(nd)中执行,具有编辑脚本的复杂性。
  • Hunt和McIlroy方法计算整个文件中的匹配,并将它们索引到所谓的k候选文件中。K为LCS长度。LCS是通过找到在适当的纵坐标范围内的匹配(遵循在他们的论文中解释的规则)而逐步增强的。在这样做的时候,每条路都会被记住。这种方法的问题在于它做的工作太多了:它存储所有路径,在最坏情况下存储O(mn)内存,而o(mn log m)存储时间复杂度。

Myers算法主要是因为它在工作时不记住路径,并且不需要“预见”到哪里,因此它可以在任何时候集中精力在最小复杂度的编辑脚本所能达到的最远位置上。这种“最小的复杂性”确保了所发现的是LCS,而不是记住它经过哪条路径,直到找到匹配时才使用更少的内存。不试图提前计算所有匹配,就可以避免它们的存储,并使它们在匹配时间而不是内存占优势。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42635889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档