【问题标题】:How do document diff algorithms work?文档差异算法如何工作?
【发布时间】:2023-03-10 04:58:01
【问题描述】:

我想实现word文档不同,需要什么算法来实现?

【问题讨论】:

  • 您会用它来显示差异,还是以最佳方式存储差异?

标签: algorithm diff


【解决方案1】:

嗯,一般来说,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

【讨论】:

  • 实现diff算法有两个目的:只存储版本之间的差异,或者显示版本之间的差异。这些有很大的不同(没有双关语的意思)。 LCS 通常只用于显示差异,但为了获得最佳存储,需要更高级的算法。例如,如果您从文档的一个部分剪切很大一部分,然后将其粘贴到另一个部分,一个好的存储算法会检测到这一点,而不是将其存储为“嘿,这里刚刚出现了很多新数据”。跨度>
  • @Lasse - 同意。由于最初的提问者是在谈论 Word 文档,我认为他们会对差异的“视觉”方面更感兴趣,而不是存储方面。但是,您在存储方面是正确的,您将研究 Delta Encoding/Compression (en.wikipedia.org/wiki/Delta_encoding) 等。
【解决方案2】:

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

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

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

【讨论】:

  • 这通常是当您假设您的文档是字符或字节流时。然而,这里的问题是关于 word 文档。在实现这样的算法之前,您需要问自己一个问题:蓝色 8pt Verdana 中的“Hello World”与红色 10pt Arial 中的“Hello World”等。
  • 是的,显然基本算法需要额外的逻辑来解析这种差异,但算法的核心还是一样的。
【解决方案3】:

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      LCS 问题的最佳解决方案是O(ND) Myer's algorithm,这是我用来区分 office 2007 文档的算法方法。 Link to algorithm paper

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多