【发布时间】:2010-05-12 08:56:13
【问题描述】:
在哪里可以找到 diff 算法的解释和实现?
首先我必须认识到我不确定这是否是算法的正确名称。例如,Stack Overflow 如何标记同一问题的两次编辑之间的差异?
PS:我知道 C 和 PHP 编程语言。
【问题讨论】:
在哪里可以找到 diff 算法的解释和实现?
首先我必须认识到我不确定这是否是算法的正确名称。例如,Stack Overflow 如何标记同一问题的两次编辑之间的差异?
PS:我知道 C 和 PHP 编程语言。
【问题讨论】:
真的没有“差异算法”这样的东西。有许多不同的 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 等实时协作编辑器最有用。
【讨论】:
wikipedia 声明是Hunt-McIlroy algorithm 有什么问题?
有 OCR'd paper 描述算法(解释),您可以检查 source(实现)。
如此相关的问题也列出(等等):
'Best' Diff Algorithm
How do document diff algorithms work?
Diff Algorithm
这一切似乎都很有用。
【讨论】: