如何实现difffunction?

我将如何去实现一个diff函数,比如stackoverflow的问题修订历史logging。

Solutions Collecting From Web of "如何实现difffunction?"

你在这里有一个实现diff算法的javascript例子 。

基于:

P. Heckel,一种隔离文件之间差异的技术 。 ACM,21,(4),264–268(1978)。

这个实现本身有两个功能,其中一个被推荐使用:

diffString( String oldFile, String newFile ) 

这个方法需要两个字符串,并计算每个字符的差异。 最后的结果是标记为“newFile”的HTML(以表示旧文件的删除和newFile的添加)。

我会找到FreeBSD diff实用程序的代码并将其用作基准。 当许可证允许这种复制时,重新发明轮子是没有意义的。

大多数算法都基于LCS: 最长的公共子序列 。 以有效的方式实施这一点并不明显。 你可能会在网上找到各种各样的语言实现。

我想唯一的方法是比较每个字符形成2个字符串。 像这样的东西:

 void diff(String first,String second) { int biggest = (first.length() > second.length()) ? first.length() : second.length(); for(int i = 0;i < biggest;i++) { //compare each char from the longest string with each char from the shorter // do something with them if they're not equal } } 

这只是我将如何做的一个草图。 一切都取决于你想要用数据做什么。

如果你想要的是修订历史,不要从差异开始重新发明轮子。 只要把所有东西都放到版本控制中,并使用它的差异和日志功能 对于简单的线性历史来说,像RCS一样简单。 或者你可以扔最新的大炮,并使用混帐 。

大多数的差异公用事业做一个逐行比较。 堆栈溢出做一个字逐字比较。 因为像wdiff这样的东西是必要的。 大多数版本控制系统让你插入diff实用程序。 开箱即用, git diff --color-words非常接近这里所做的。 稍微摆弄一下设置,你就可以得到它吐出一些你可以做成一个漂亮的网页。