文档差异算法如何工作?

时间:2009-10-02 15:22:00

标签: algorithm diff

我想实现word文档的不同,需要实现哪些算法?

5 个答案:

答案 0 :(得分:31)

嗯,一般来说,diff通常由Longest common subsequence problem解决。另请参阅Algorithm"上的维基百科文章的“Diff部分:

  

diff的操作基于   解决最长的共同子序列   问题

     

在这个问题上,你有两个   项目序列:

   a b c d f g h j q z

   a b c d e f g i j k r x y z
     

你想找到最长的   存在的项目序列   两个原始序列都在同一个   订购。也就是说,你想要找到一个新的   可以从中获得的序列   删除一些序列的第一个序列   项目,并从第二个序列   删除其他项目。你也想要   这个序列要长   可能。在这种情况下,它是

   a b c d f g j z
     

从最长的共同后续序列   这只是一小步   差异输出:

   e   h i   q   k r x y 
   +   - +   -   + + + +

也就是说,这一切都适用于基于文本的文档。由于Word文档实际上是二进制格式,并且包含大量格式化信息和数据,因此这将更加复杂。理想情况下,您可以考虑自动化Word本身,因为它具有在文档之间“区分”的能力,如下所述:

Microsoft Word Tip: How to compare two documents for differences

答案 1 :(得分:15)

差异基本上只是a solutionlongest common sub-sequence problem

最佳解决方案需要dynamic programming的知识,因此这是一个相当复杂的问题需要解决。

但是,也可以通过构造后缀树来完成。两种算法都概述了here

答案 2 :(得分:6)

答案 3 :(得分:2)

正如Ben S所指出的,差异问题通常可以通过解决最长的常见子序列问题来解决。更具体地说,Hunt-McIlroy algorithm是已经应用于该问题的经典算法之一(例如在Unix'diff实用程序的实现中)。

答案 4 :(得分:2)

lcs的最优化解决方案是O(ND) Myer 's algorithm,这是我用来实现diff office 2007文档的算法方法。 Link to algorithm paper