【问题标题】:Where can I find the diff algorithm?我在哪里可以找到差异算法?
【发布时间】:2010-05-12 08:56:13
【问题描述】:

在哪里可以找到 diff 算法的解释和实现?

首先我必须认识到我不确定这是否是算法的正确名称。例如,Stack Overflow 如何标记同一问题的两次编辑之间的差异?

PS:我知道 C 和 PHP 编程语言。

【问题讨论】:

    标签: algorithm diff


    【解决方案1】:

    真的没有“差异算法”这样的东西。有许多不同的 diff 算法,实际上使用的特定 diff 算法在某些情况下被认为是特定 diff 工具的商业优势。

    一般来说,许多 diff 算法都基于最长公共子序列 (LCS) 问题。

    1970 年代最初的 Unix diff 程序由 Doug McIllroy 编写,并使用了所谓的 Hunt-McIllroy 算法。近 40 年后,该算法的扩展和派生仍然非常普遍。

    几年前,Bram Cohen(最成功的文件共享程序和最不成功的版本控制系统的创建者)创建了Patience Diff algorithm,旨在提供比 LCS 更易于阅读的结果。它最初是在 Bazaar VCS 中实现的,也作为一个选项添加到 Git。

    但是,除非您对差异算法的研究感兴趣,否则最好的选择可能是只使用一些现有的差异库,如 Davide Libenzi's LibXDiff,例如 Git 使用的。如果已经有一个 PHP 扩展包装它,我不会太惊讶。 Google's Diff-Match-Patch library 是一个不错的替代方案,例如在 Bespin 或 WhiteRoom 中使用,并且可用于多种语言。它使用 Meyers Diff 算法以及一些预处理和后处理来获得额外的加速。

    如果您对合并比对差异更感兴趣,那么一种完全不同的方法称为操作转换。 OT 的想法是,您尝试“逆向工程”导致这些差异的操作,而不是找出两个文档之间的差异。这允许更好的合并,因为您可以“重放”这些操作。这些对于 EtherPad、Google Wave 或 SubEthaEdit 等实时协作编辑器最有用。

    【讨论】:

    • 非常感谢您的回答。不幸的是,我只有一票,这一次我会喜欢更多的排名
    • +1 用于告知存在操作转换
    • 只是一个细节:diff 命令、diff-match-patch 和 LibXDiff(用于文本文件)都使用 Meyers 算法。另一个有趣的答案:stackoverflow.com/a/1313218/114357
    【解决方案2】:

    wikipedia 声明是Hunt-McIlroy algorithm 有什么问题?

    有 OCR'd paper 描述算法(解释),您可以检查 source(实现)。

    如此相关的问题也列出(等等):
    'Best' Diff Algorithm
    How do document diff algorithms work?
    Diff Algorithm
    这一切似乎都很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-10
      • 2011-01-24
      • 2017-07-27
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      相关资源
      最近更新 更多