Diff程序的原理

使用版本控制工具CVS或者ClearCase中有merge的概念,而merge又是基于diff的,Linux/Unix下面的dif程序就能够获得两个文本文件的不同。Diff程序可以获得两个文本文件以行为单位的差异,基于LCS(Longest Common Subsequnece)算法。

一个Subsequence的概念是......举例说明吧,一个字符串“FallenOrc”,“FaOrc"是一个subsequence,"Flr"也是一个subsequence,因为他们每个字符在"FallenOrc"都有而且出现的次序一致,不要求字符连续出现,而"FrOc"就不是subsequnece了,因为"O"跑到"r"前面去了。所谓Common Subsequence,就是两个字符串共同的subsequence,比如对字符串“FallenOrc"和“SegmentFault",“Fa"就是一个Common Subsequence。Longest Commone Subsequence,就是两个字符串最大的Commone Subsequence。可以想象,如果获得了两个字符串的LCS,也就可以进一步通过比较知道这两个字符串有哪些差异。

LCS算法可以应用在DNA比较上,因为DNA实际上可以看作是字符串,通过LCS比对,已知一段DNA,可以搜索DNA库找到最相近的DNA,作用大吧

应用于diff程序,很简单,就是把每一行当作一个字符。LCS算法一个缺点就是空间复杂性比较大,两个文件行数分别为m和n,空间复杂性为O(m*n),对大一点的文件,比起来就比较费资源了。

www.code.project上有一个印度哥们写的diff程序,基本上就是实现LCS算法,不过他有两点比较巧妙,但是也值得商榷
1) 他把每一行文本通过hash算法产生一个值,这样文本行的比较就不是比较行,而是比较hash值,可以节省时间,但是hash值不是100%可靠的,完全可能有不同的两行hash值相同。
2) 他改进了一点算法,把中间结果用一个bit位存贮,把空间占有率减少到传统方法的1/8,这样空间复杂性还是O(m*n),也没有决定性的提高效能。



你可能感兴趣的:(Diff程序的原理)