【发布时间】:2023-03-10 04:58:01
【问题描述】:
我想实现word文档不同,需要什么算法来实现?
【问题讨论】:
-
您会用它来显示差异,还是以最佳方式存储差异?
我想实现word文档不同,需要什么算法来实现?
【问题讨论】:
嗯,一般来说,diff'ing 通常由Longest common subsequence problem 解决。另请参阅Diff 上的维基百科文章的“Algorithm"”部分:
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
【讨论】:
差异本质上只是a solution 与longest common sub-sequence problem。
最佳解决方案需要了解dynamic programming,因此这是一个相当复杂的问题。
但是,也可以通过构建后缀树来完成。两种算法都概述了here。
【讨论】:
正如 Ben S 所指出的,差分问题通常可以通过解决最长公共子序列问题来解决。更具体地说,Hunt-McIlroy algorithm 是已应用于该问题的经典算法之一(例如在 Unix 的diff 实用程序的实现中)。
【讨论】:
LCS 问题的最佳解决方案是O(ND) Myer's algorithm,这是我用来区分 office 2007 文档的算法方法。 Link to algorithm paper
【讨论】: