我想实现word文档的不同,需要实现哪些算法?
答案 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 solution的longest 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