《修改》2分查找,速度绝对地提升【已经证明】

10.16原2分查找有序数列(递归到首尾下标相同结束)。假设数列a(n)=n;X为2的100次方,有序表为a(1~x),那找这个【其实任意】有序表(n个数)里的【任意】一个数,递归函数都要做M次【下面的(1)情况】或者M+1次【下面的(2)情况】(M为log2(n)去掉小数点后的到的整数)】,如上面那个要100次(即使是找1或X),【改后】的只要原表或递归切割出来的子表的首或尾出现“查找数”就找到了; 

简单的修改:

///

       只要【原表】的【首下标】和【尾下标】没有问题,那就不会进入外层的else中(因为当子表只有2个数时就已经退出了;


if(首下标<尾下标)///

      if(首位数==查找数)位置为首下标;//结束(没递归)

      else if(末位数==查找数)位置为尾下标;//同上

     else

  {

         if(首下标==尾下标-1){没有这个数;//退出递归(报错)}//只有2个数,有首尾都不是。。。

          else//多于3个数,继续切割。。

       {

           照写;递归

        }

    }

else/表里只有一个数,或前后下标有问题。

           if(首位数==查找数)位置为下标;//

           else  报错;//下标有问题,或没有这个数;

以下为基于【修改前】的【倒数第2或3次递归的前面的原表或子表】都没有出现首或尾为“查找数”的情况。。。

//

在以下情况下,【改后】和【改前】的运算速度的比较【基于【修改前】2分查找的比较】:

(1)当“查找数”在序列表的倒数第二次递归的子表中时

   1. 如果子表个数为2,那改后的速度快  ;//改前的还得再切一次

 2.如果子表个数为3,【而且“查找数”为3个里的最后一个】,那还是【改后】快;//【改前】的还得再切一次
  (注:切法是有偶数个时左右个数相同,奇数个时左边比右边多一个)  
    
 }

///【以上这2禾中情况是2分查找里速度最快的情况】(如1,2,3,4,5)找1或2切了3次;找3或4或5只切了两次,即【(1)中的情况比(2)中的少切了一次】

 (2) 1.如果子表个数为3,而且【“查找数”为3个里的中间那个】,则此次为【【改前】倒数第三次递归】【【改后】则是倒数第二次】),【改前的】得在切2次,【改后】的只要切一次;

改后则不用(速度快了);

             2.如果子表个数为3,而且【“查找数”为3个里的第一个】,则此次为【【改前】倒数第三次递归】;【【改后】则结束了】;
 

(3)当没有这个“查找数”时,【改后】速度照样比【改前】快(因为【改后】的递归到只有2个数时就结束了,而【改前】的要到1个数是才结束);

     *【【改前的2分查找只有以上3种情况,好像没有其它的情况了(注:无论找数列里的哪个数都是要递归到只剩下1个数才停】】

     *【【改后的,只要在其原表,或其分割出的任意一个子表的首尾出现“查找数”就可以停了】】
————————————————
版权声明:本文为CSDN博主「zhangbilei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangbilei/article/details/5950202

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值