自己写beyondcompare
来源:互联网 发布:知柏地黄丸功效 编辑:程序博客网 时间:2024/06/05 13:46
文件对比,说白了,就是打开文件,读取文件,当做字符进行比较。遇到较大的文件,一次读完不够内存的话,就需要分割成多块,对比完之后,将对比生成的报告,连接在一起。
这么看来,文件和字符串都可以抽象成块(block)
———————— block1, 长度m
—————————— block2 , 长度n
如果对比上面两个block,希望找出两个block的差异,对比的算法抽象成这样一个过程:
1. 从较长的block2中找出较短block1的全字符匹位置为:
M(block1, 1,m,block2,1,n);
如果有幸找到,则这个算法复杂度为O(n-m)·U(m) ,其中U(m)表示m个字符全字符比较的时间复杂度。
如果不幸,未能直接在block2中找到block1块,则需要继续。(事实上,通常情况下的比较都是这种不幸。)
2. 好的。既然未能从block2中找到block1这个子集,那么现在假设分割block2能解决问题,分割的方法:
———————— block1, 长度m
————— block3, 长度n/2 ————— block4, 长度n/2
即,将长的block2分割成block3和block4。那么算法复杂度为:2·O(m-n/2)·U(n/2)
假设分割的是block1,那么算法复杂度为:2·O(n-m/2)·U(m/2)
由于n>m,所以O(n-m/2) > O(m-n/2)。这样分割的规则是:分割此次较长的block,可以在分割后的比较中获得更高的效率。那么很可能这两个原始的块会在比较进行过程中被交替分割。
3. 从分割之后的比较可以看成步骤1了。
————— block3, 长度n/2
———————— block1, 长度m
由于block3和block4等长,所以,比较的结果体现了最长匹配的结果。(考虑block3和block4拼接的情况,是block2包含block1的假设;同时,如果这种假设不存在的话,将在后续继续分割block1后,找到这种比较集,因此只需单独考虑block3和block4)
4.如果从block1中找到block3:
———————— block1, 长度m。包含(block3, 2, n/2 + 1)
那么block1被分割成
— block5 = block1(1,1)
————— block6 = block1(2,n/2+1)
—— block7 = block1(n/2 + 2, m)
而block2除去block3之后,剩余的block4只能与block7进行匹配。比较范围被缩短的感觉真好:O(n/2 - (m - n/2 -1))·U(m-n/2 + 1))
5.比较block4和block7的工作便成了第1步做的事情了。多么令人欣慰的结果!
那么这个算法获得的算法复杂度(这个复杂度不好计算,大概这个结果不甚正确 o(╯□╰)o):
如果直接穷举的话,复杂度:
如此一来,分段的算法,确实能获得高效的结果!
0 0
- 自己写beyondcompare
- git下配置beyondCompare
- CentOS上运行BeyondCompare
- beyondCompare试用期到期解决办法
- beyondCompare试用期到期解决办法
- beyondCompare试用期到期解决办法
- 自己写个ftp
- 第一次自己写blog
- 写自己的rss
- 写自己的rss
- 自己写的sqlhelper
- 学习 自己写操作系统
- 自己写的strcmp
- 自己写的一首诗
- 写自己的软件
- 写自己的rss
- 写程序,做自己
- 写个自己的
- 加盟前请看看这些加盟防骗技巧
- SqlServer 循环插入 大量 测试数据
- heritrix1.14升级到3.1
- java中list、set、map的各种遍历方法
- 手工创建数据库,并利用emca建OEM
- 自己写beyondcompare
- 一些大牛的Android博客
- 数值计算之二:迭代法求线性方程的解
- 通过js为表单添加CSS样式
- 10年夜身分影响上网站采办转化率
- 奋斗
- 树状数组
- 自考进行时
- 使用github之:TortoiseGit和msysGit配置