问题 文本的C#Diff算法


我正在寻找一种差异算法,它将产生类似SO的编辑修订页面的结果。我或多或少刚开始寻找,我不反对自己做,但我不需要重新发明轮子。

我将使用C#4.0。我基本上有两个字符串,旧字符串和新字符串。我想通过突出显示和突破来了解新增内容的变化。


4085
2017-09-21 20:14


起源



答案:


它的基础 Longest common subsequence 算法,俗称 LCS

旧文本和新文本的LCS给出了保持不变的部分。因此,不属于LCS的旧文本部分是已更改的部分。

从上面的维基页面:

它是经典计算机科学问题的基础 DIFF (文件比较程序,输出两个文件之间的差异),并具有生物信息学应用程序。


5
2017-09-21 20:31





你可以看看 Menees Diff 以C#编写的示例。


4
2017-09-21 21:12



死链接,请修改。谢谢 - Chris Hayes
链接已得到纠正。 - cfeduke


答案:


它的基础 Longest common subsequence 算法,俗称 LCS

旧文本和新文本的LCS给出了保持不变的部分。因此,不属于LCS的旧文本部分是已更改的部分。

从上面的维基页面:

它是经典计算机科学问题的基础 DIFF (文件比较程序,输出两个文件之间的差异),并具有生物信息学应用程序。


5
2017-09-21 20:31





你可以看看 Menees Diff 以C#编写的示例。


4
2017-09-21 21:12



死链接,请修改。谢谢 - Chris Hayes
链接已得到纠正。 - cfeduke


通常用a实现 最常见的子串 算法。 这个帖子 将是有趣的。


3
2017-09-21 20:18



它不是最常见的 子 但最长的共同点 子。子字符串总是连续的,但子序列不一定是。对旧文本所做的更改以获取新文本不需要在连续字符上。 - codaddict
同意。您需要在最长公共子序列问题与最长公共子字符串问题之间进行分类。 - quantity


我发现Google已经发布了包含c#类和测试代码的diff,match和patch代码。代码不是很难使用恕我直言。

https://code.google.com/archive/p/google-diff-match-patch/

这里有详细记录:

https://code.google.com/archive/p/google-diff-match-patch/wikis/API.wiki


2
2018-06-15 12:27





我发现这篇文章很容易遵循清晰的代码和简单的例子。我只读过它,我还没有实现它。

  1. 文章系列概述,使用的算法概述。
  2. 最长公共子串实现。
  3. Diff实现。

1
2018-06-20 15:10