我使用LCS算法在c ++中实现我自己的diff。在查看LCS算法文件并尝试查找SES(最短编辑脚本)时,有时会对某一行进行更改。在下面的图表示例中,它仅显示插入和删除。因此,向后遍历图表时,水平线是删除,垂直线是插入。你有'c'改变案例的情况是什么?我假设它将是一个水平线,后跟一个垂直ie:删除然后插入将被视为更改。我还没有在C ++中看到任何直接创建SES的代码。也许有一个更好的实现可以获得O(ND)或更好的时间复杂度,虽然我不知道如何在不创建和反转图形的情况下创建SES。我可以实现LCS构建图形并遍历它我只是想提前知道创建SES的确切规则是什么,因为在这种情况下你可能需要保持2个状态删除和插入被认为是行变化)?请参阅以下文件,您将获得更改3,4c4,6(见下文)。如果有人有任何示例代码,这样做是为了最大化c ++中的运行时间与空间的关系,这将有助于作为参考,特别是在以下所示的当前diff二进制形式中创建diff输出。我正在使用这个版本,因为我在运行时最大化并为此牺牲了空间。
参见文件第3页及其示例图表,其中显示了图表的SES反向
http://www.xmailserver.org/diff2.pdf
我在linux上使用常规diff的改变示例
fileA.txt
a
b
c
d
e
f
g
fileB.txt
w
a
b
x
z
y
e
diff fileA.txt fileB.txt
0a1
> w
3,4c4,6
< c
< d
---
> x
> z
> y
6,7d7
< f
< g
答案 0 :(得分:0)
基本上不需要'c'或更改功能。您可以从LCS树中返回,该LCS树提供SES,您只需插入和删除即可重建两者。