二分查找中的对半查找和采用斐波那契法查找的效率分析(信息论描述)

            这是给老师交流的一封邮件,觉得还算有价值,稍微改动一下。贴出来共同交流。思维难免会有纰漏,还请多多交流.

 

 

    斐波那契二分查找的时间复杂度是O(log(n)).这个直接从斐波那契数列的表达式就能想得到。(n在指数位置)。对半二分法查找 时间复杂度也是O(log(n))。 既然两个都是O(log(n)),就要从更细的角度去分析者两个算法了。
 
 
 
关于这两个算法的效率问题,我找到了最终的比较可信的答案在 
   http://www.cnki.com.cn/Article/CJFDTotal-HXDY201103013.htm    这篇论文中,其中明确说明了:” 斐波那契查找的平均性能优于二分查找。实验数据表明,斐波那契查找算法大约较二分查找算法快17%“ 但是这个要归结于这样一个原因:“  斐波那契查找算法在分割时中只须做加、减法运算而无须做乘法运算。 
这样看似把问题简化了(当然也可以不求甚解地说解决了),但是实则复杂化了。为什么呢,我的想法是这样的:
 
关于一个算法的效率,我觉得应该从两个方面考虑:1.算法在思想上的效率,这个可以用这个算法执行的步数来衡量。2.算法的实际执行效率。     实际上,第二种效率是会根据算法思想的执行方式的不同而改变。
我们现在先从第一个方面分析这两个算法。(这其中的很多想法都来源于以前看过的一篇博文: http://mindhacks.cn/2008/06/13/why-is-quicksort-so-quick/). 信息论   是我非常喜欢的一门学科,我觉得可以用这其中的知识很好的分析这两个算法。假如我们要从m个数中查找一个数n。那么在查找之前,n在m中的位置是一个未知事件。所以,此时n的位置这一事件的信息熵=-log2(1/m)=log2(m)  单位是Bit。
然后,对于对分法,每执行一“步”(这里的“步”,是算法思想上的概念,与具体实现无关),就使得“n在m中的位置”这一事件的信息熵减少了,减少量是这样的:未执行这一步之前,n在左边、右边的概率一样的,均为0.5,执行之后,确定了n的左右位置,此时n在左边或者右边概率为1.所以,减少的熵为:0.5*log2(2)+0.5*log2(2)-1*log2(1)=1 Bit.  此时n在m中的位置这一信息的熵变为:log2(m)-1;这样执行多步,直到信息熵小于等于1;此时执行的最大步数是([向下取整 log2(m)]+1)。这个值正好等于理论值。
对于斐波那契分点查找法,同理但不同值,每执行一步,减少的熵是:0.618*log(1/0.618)+0.312*log(1/0.312)=0.9537 Bit;(很明显这个值,小于1 Bit,因为信息论明确指出,等概率事件的熵最大——这也是对半二分法在思想上效率最大的证据。(只针对二分法,相比于斐波那契二分))。
画了两个图:
    
红线代表斐波那契二分,绿色代表对半二分。分别是两个的最大执行步数。很明显,对半法是优于另一种的。
 
 
 
 
 
 在考虑第二个方面: 2.算法的实际执行效率。
   对半查找的常用形式:
while(low<=high)
{
    m=(low+high)/2;
    if(x<l[m])
    {
        high=m-1;
    }
    else if (x>l[m])low=m+1;
    else {
    x=l[m]; return Success;
    }
}
斐波那契查找算法如下:
while ( mid > 0 && ! found ) {
if ( key = = ST[mid])
found = true; / / 找到待查元素
else if ( key < ST[mid ]) { / /在有序表未查找区间的前段查找
if ( ! f2 ) mid = 0;
else {
mid = mid - f2;
t = f1 - f2;
f1 = f2; f2 = t;
}
}
很容易发现 斐波那契查找算法 在核心部分只使用了 减 运算和  赋值运算;而   对半查找用到了一个除法运算。
这就导致了论文中所说的:“斐波那契查找的平均性能优于二分查找。实验数据表明,斐波那契查找算法大约较二分查找算法快17%
"的现象。具体CPU怎么执行除法我也不知道,但是实验数据时说明了这个过程比减法慢。
 
 
所以说,我觉得可以这样总结一下:在理论上,对半二分法的速度是二分法中步数最少的。但是在实际实现中,斐波那契二分查找算法因为每一步计算 简单,所以虽然牺牲了部分步数,但总的效率是更高的。
 
 
 
我觉得想了这么多,还是有一些意义的。我觉得可以顺着这个思路,去寻找更好的对半查找的实现算法(如果可能的话,只用到加减运算)。

 

 

转载于:https://www.cnblogs.com/Tili/archive/2012/04/20/2458740.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值