我在哪里可以找到diff算法?

时间:2010-05-12 08:56:13

标签: algorithm diff

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

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

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

2 个答案:

答案 0 :(得分:38)

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

通常,许多diff算法都基于最长公共子序列(LCS)问题。

1970年代的原始Unix diff程序由Doug McIllroy编写,并使用了所谓的Hunt-McIllroy算法。差不多40年后,该算法的扩展和衍生产品仍然非常普遍。

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

然而,除非你对diff算法的研究感兴趣,否则你最好的选择就是使用像Davide Libenzi's LibXDiff这样的现有差异库,例如Git使用的那些。如果已经有一个PHP扩展包装它,我不会太惊讶。一个不错的选择是Google's Diff-Match-Patch library,例如在Bespin或WhiteRoom中使用,它可用于许多语言。它使用Meyers Diff算法加上一些预处理和后处理以获得额外的加速。

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

答案 1 :(得分:8)

wikipedia表示Hunt-McIlroy algorithm是什么错误?

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

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