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),也没有决定性的提高效能。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值