该diff程序具有各种形式,相当擅长计算两个文本文件之间的差异,并且比完整显示两个文件更紧凑地表达它。它以一系列插入和删除的行(或在某些情况下为更改的行,但等同于删除后插入)的顺序显示差异。patch源控制系统使用相同或非常相似的程序或算法,以最小化表示同一文件的两个版本之间的差异所需的存储。在这里和这里讨论该算法。
diff
patch
但是当文本块在文件中 移动 时,它会下降。
假设您具有以下两个文件,a.txt并且b.txt(假设它们都是几百行而不是只有六行):
a.txt
b.txt
a.txt b.txt ----- ----- 1 4 2 5 3 6 4 1 5 2 6 3
diff a.txt b.txt 显示如下:
diff a.txt b.txt
$ diff a.txt b.txt 1,3d0 < 1 < 2 < 3 6a4,6 > 1 > 2 > 3
从a.txt到的更改b.txt可以表示为“采用前三行并将其移至末尾”,但是diff两次显示已移动的行的完整内容,却没有机会非常简短地描述这一大更改。
请注意,diff -e该文本块仅显示一次,但这是因为它不显示已删除行的内容。
diff -e
该diff算法是否有一个变体,(a)保留diff了表示插入和删除的能力,(b)有效地表示了移动的文本块而不必显示其全部内容?
由于您要求的是算法而不是应用程序,因此请阅读WalterTichy的“带有块移动的字符串到字符串校正问题”。还有其他内容,但这是原始内容,因此您可以查找引用它的论文以找到更多信息。
该论文引用了保罗·海克尔(PaulHeckel)的论文“隔离文件之间差异的一种技术”,并提及了其算法:
Heckel[3]指出了与LCS技术类似的问题,并提出了一种线性石灰算法来检测块运动。如果字符串中几乎没有重复的符号,则该算法将充分执行。但是,否则该算法将给出较差的结果。例如,给定两个字符串 aabb 和 bbaa ,Heckel的算法无法发现任何公共子字符串。