二分查找需要注意的Bug

不应该使用Middle=(left+right)/2这种情况,否则对于大数据来说会产生溢出问题。切记!值不同的时候,left相对Middle应该+1,不要直接用Middle进行赋值。

#include <iostream>

#include <set>

using namespace  std;

//下面一个移位是一样的,>>相当于除去2,主要是要用right-left,否则对于大数据来说会产生溢出问题。切记

int binarySearch(int arr[],int len,int number)

{

int left=0;

int right=len-1;

int middle;

while (left<=right)

{

middle=left+(right-left)/2;

if (arr[middle]<number)

{

left=middle+1;

}

else if (arr[middle]>number)

{

right=middle-1;

}

else

{

return middle;

}

}

}

int main()

{

//multiset<int> si;

//si.insert(1);

//si.insert(2);

//si.insert(6);

//si.insert(2);

//si.insert(4);

//si.insert(5);

//multiset<int>::iterator i;

////set<int>::const_iterator   ibegin,iend;

////iend=si.end();

//for (i=si.begin();i!=si.end();i++)

//{

//    cout<<*i<<endl;

//}

int array1[]={0,10,20,30,40};

int ret;

ret=binarySearch(array1,5,40);

cout<<ret<<endl;

return 0;

}

//int binary_search(int array[],int n,int value)

//{

//    int left=0;

//    int right=n-1;

//    //如果这里是int right = n 的话,那么下面有两处地方需要修改,以保证一一对应:

//    //1、下面循环的条件则是while(left < right)

//    //2、循环内当array[middle]>value 的时候,right = mid

//

//    while (left<=right)          //循环条件,适时而变

//    {

//        int middle=left + ((right-left)>>1);  //防止溢出,移位也更高效。同时,每次循环都需要更新。

//

//        if (array[middle]>value)

//        {

//            right =middle-1;   //right赋值,适时而变

//        }

//        else if(array[middle]<value)

//        {

//            left=middle+1;

//        }

//        else

//            return middle;

//        //可能会有读者认为刚开始时就要判断相等,但毕竟数组中不相等的情况更多

//        //如果每次循环都判断一下是否相等,将耗费时间

//    }

//    return -1;

//} 

二分查找需要注意的Bug

时间: 2024-10-27 05:41:46

二分查找需要注意的Bug的相关文章

二分查找 : 那个隐藏了 10 年的 Java Bug

一个偶然的机会,我想起以前还在谷歌上班的时候,有时候大家会在饭桌上讨论最新想出来的一些面试题.在众多有趣又有难度的题目中,有一道老题却是大家都纷纷选择避开的,那就是去实现二分查找. 因为它很好写,却很难写对.可以想象问了这道题后,在5分钟之内面试的同学会相当自信的将那一小段代码交给我们,剩下的就是考验面试官能否在更短的时间内看出这段代码的bug了. 二分查找是什么呢,这个不只程序员,其他很多非技术人员也会.比如我想一个1到100以内的数,你来猜,我告诉你每次猜的是大了还是小了,你会先猜50,然后

二分查找如何“花式”卖萌

二分查找,敢说这货埋在土里化到灰里应该都是认得的.其原理思想也是如此的简单明了,敲代码时都懒得经过反射弧.但事实上,据Knuth神犇描述,第一个木有bug的二分查找是这个算法发表之后12年在出现,但后来发现还是存在一些数组越界的小问题.而如今,我们大都是开门见山的学习被前辈们优化证明的算法,这也是“牛逼顿”所谓的站在巨人的肩膀上,却也如此. 回头来看二分查找如何“花式”卖萌. Problem:给定一个有序数组A,且数组中的元素存在重复,各大一个目标值target,求目标值在数组的的下标的区间(即

自己犯得错---二分查找

二分查找都好难啊... 路途漫漫兮.没看书之前自己第一遍的实现,循环的终止条件是仅仅判断mid值是否落在区间内.当然这个是错误的,而且比较愚蠢. 第二次 查了下网上的实现后 把循环的判读条件改成了while(l < h) ,循环外直接return -1:对于我的实现,又犯了一个错误,这种条件下会少比较一个元素,就是少比较 l = h 时 指向的元素. 最后我把 循环条件改成了 while(l <= h) 才没有测试出错. 不过可能我的测试用例可能没有覆盖完全,明天再继续论证下. 二分查找还要一

用C语言实现二分查找算法

二分查找算法思想非常简单,就是折半查找一个有序序列,在这里,我用二分查找一个顺序排列的整形数组.若用C实现的话我们需要注意以下几个方面: 1.如何判断查找完成,定义返回值含义,定义退出循环条件 2.如何处理边界问题,例如1 2 3 这个序列,当我们要查找1或者3时,会不会使程序出现BUG 3.对于数列来说,我们通常用整形存储其下标,二分查找若取下标中间数,则会出现什么样的问题?这些问题是否会影响我们的查找,若有问题,则应该如何规避? 通常情况,作为一个初学者,我甚至觉得二分查找过于简单,不值一提

二分查找实现(Jon Bentley:90%程序员无法正确实现)

二分查找实现(Jon Bentley:90%程序员无法正确实现)作者:July出处:结构之法算法之道引言Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码.也许很多人都早已听说过这句话,但我还是想引用<编程珠玑>上的如下几段文字:“二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T 的范围,最终就可以找到它.一开始,范围覆盖整个数组.将数组的中间项与T 进行比较,可以排除一半元素,范围缩小一半.就这样反复比较,反复缩小范围,

三分钟教你学Git(十三) - 二分查找

比方说你收到了错误报告,然后你知道前几天明明是好的.可是这几天有好多新的commit被部署了.那么我们怎么迅速的找到第一个引入Bug的commit呢? 我们能够使用git bisect,git利用二分查找法迅速找到第一个坏的commit,下边看看详细怎么用就明确了. 我们首先告诉git我们要開始binary search了. # git bisect start 然后我们告诉git当前的commit是一个坏的提交. #git bisect bad 然后我们再告诉git我们已知的一个好的提交,这样

二分查找和二叉树的羁绊!!

最近博主的老师让博主写一个二分查找,并且计算他的时间复杂度. 首先我是这样写的: 1 #include<stdio.h> 2 #include<assert.h> 3 4 void binary_search(int arr[],int len,int num){ 5         assert(arr); 6         int left = 0; 7         int right = len-1; 8         while(left<right){ 9

有序数组中的二分查找

最近看一些算法题发现这些问题到最后落实到编程实现上都是一种基础的体现,包括对基本的for,if,else,while等语句的理解程度,还有对循环递归的理解.所以还是得回归最基本的算法,现在去学习那些高深复杂的DP,KMP,红黑树未免有点好高骛远.目前应该坚持基础,打好基础,毕竟不是CS科班出身.言归正传,二分查找就是一个最基础的算法.它的时间复杂度O(logn).分为迭代实现和递归实现两种,如下:程序没有经过很多测试,应该有bug,欢迎指正. int BinarySearch(int * a,

【转】STL之二分查找 (Binary search in STL)

Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 本文是对Effective STL第45条的一个总结,阐述了各种查找算法的异同以及使用他们的时机. 首先可供查找的算法大致有count,find,binary_search,lower_bound,upper_bound,equal_range.带有判别式的如count_if,find_if或者binary_search的派别式版本,其