我有很长的文本字符串,我希望区分和修补。这是字符串a和b:
string a = ...;
string b = ...;
string a_diff_b = create_patch(a,b);
string a2 = apply_patch(a_diff_b, b);
assert(a == a2);
如果a_diff_b
是人类可读的,那将是一个奖励。
实现此目的的一种方法是使用system(3)
从diff
调用patch
和diffutils
shell命令并将它们管道化。另一种方法是自己实现这些功能(我正在考虑原子地处理每一行并使用标准的编辑距离n ^ 3算法逐行回溯)。
我想知道是否有人知道一个好的Linux C或C ++库可以在进程中完成这项工作吗?
答案 0 :(得分:7)
答案 1 :(得分:7)
你可以谷歌实施迈尔斯差异算法。 (“一个O(ND)差分算法及其变化”)或解决“最长公共子序列”问题的库。
据我所知,C ++中diff / patch的情况并不好 - 有几个库(包括diff match patch,libmba),但根据我的经验,它们要么是记录稍差或有很多外部依赖项(例如,差异匹配补丁需要Qt 4)或专门用于您不需要的类型(例如,当您需要unicode时为std :: string),或者不够通用,或者使用具有非常高的存储器要求的通用算法((M + N)^ 2,其中M和N是输入序列的长度)。
您也可以尝试自己实施Myers算法((N + M)内存要求),但问题的解决方案极难理解 - 预计会浪费至少一周的阅读文档。 Myers算法有一些人类可读的解释here。
答案 2 :(得分:3)
http://code.google.com/p/google-diff-match-patch/
Diff Match和Patch库提供了强大的算法来执行同步纯文本所需的操作。
目前提供Java,JavaScript,Dart,C ++,C#,Objective C,Lua和Python。无论语言如何,每个库都具有相同的API和相同的功能。所有版本都有全面的测试工具。