自己写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
原创粉丝点击