Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux C或C++;库到差异和补丁字符串?_C++_C_Linux_Algorithm_Diff - Fatal编程技术网

C++ Linux C或C++;库到差异和补丁字符串?

C++ Linux C或C++;库到差异和补丁字符串?,c++,c,linux,algorithm,diff,C++,C,Linux,Algorithm,Diff,可能重复: 我有很长的文本字符串,我希望区分和修补它们。即给定字符串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\u b是人类可读的,那将是一个额外的好处 实现这一点的一种方法是使用system(3)从diffutils调用diff和patchshell命令,并

可能重复:

我有很长的文本字符串,我希望区分和修补它们。即给定字符串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\u b
是人类可读的,那将是一个额外的好处

实现这一点的一种方法是使用
system(3)
diffutils
调用
diff
patch
shell命令,并通过管道将它们传输到字符串中。另一种方法是自己实现这些函数(我想用原子方法处理每一行,并使用标准的编辑距离n^3算法逐行回溯)

我想知道有没有人知道一个好的Linux C或C++库,可以在进程中完成这个工作?< /P> < P>我相信

可能有你需要的

Diff Match和Patch库提供了健壮的算法来执行同步纯文本所需的操作

目前在java、javascript、Dart、C++、c++、目标C、Lua和Python中可用。无论使用何种语言,每个库都具有相同的API和相同的功能。所有版本都有全面的测试线束


您可以在谷歌上搜索Myers Diff算法的实现。(“O(ND)差分算法及其变体”)或解决“最长公共子序列”问题的库

我知道,C++中的差异/补丁的情况不好——有几个库(包括),但是根据我的经验,它们要么有一些文档记录不足或具有严重的外部依赖性(例如,差异匹配补丁需要Qt 4),要么专门针对不需要的类型。(例如,当您需要unicode时为std::string),或者不够通用,或者使用具有非常高内存要求的通用算法((M+N)^2,其中M和N是输入序列的长度)


您还可以尝试实现Myers算法((N+M)内存需求)你自己,但问题的解决方案极难理解-预计至少要浪费一周的时间阅读文档。Myers算法的一些可读性说明是可用的。

此链接是否有用?如果你能将Python嵌入到应用程序中,将很有帮助。请查看:我昨晚阅读了原始论文:。如果您首先知道编辑距离算法,这是相当简单的。基本上,它不会搜索整个编辑图,而是首先搜索更改最少的路径,并将结果存储到下一次迭代中,每次扩展一个更改。因此,一旦找到端点,它将是一个更改最少的解决方案,而且它只会首先搜索更好的可能解决方案。这是一个最佳优先搜索算法(
a*
)的特例。@AndrewTomazos Dethomling:这并不简单。例如,很难确切地说出什么是“中间蛇”.当然,这对有数学背景的人来说可能很简单,“中间蛇”细化是对基本算法的扩展。它只是意味着同时从左上角到右下角进行搜索,反之亦然。当两个搜索满足时,您就有了一个解决方案。您可以放弃回溯路径信息,并将此双重算法作为“二进制搜索”重复使用分治递归虽然需要对数更多的时间,但只需要线性空间(如果空间是额外的)。中间蛇不是一种细化。它是Myers算法的核心。我编写了libmba,diff实现没有外部依赖性(它只使用libmba包中的另一个模块,因此可以通过调整Makefile将其完全隔离)我意识到自己实现这样的东西很有趣,这将是一个很好的编程练习,但是你很难找到更好的东西。关于Myers的算法,我实现了轻量级C/C++库()基于他后来的文章,他在文章中描述了用于计算编辑距离的位向量算法。这当然不是一个容易实现的问题,尤其是如果您希望它速度更快的话。它还返回您所称的“中间蛇”(我称之为对齐路径)。