二分查找容易忽略的一个bug
2014-10-07 07:21
260 查看
对于二分查找算法,相信大家肯定不会陌生。算法从一个排好序的数组中找指定的元素,如果找到了返回该元素在数组中的索引,否则返回-1。下面给出了解法。
[cpp] view
plaincopyprint?
//a为排好序的数组,n为数组的大小,x为指定元素
int binarySearch(int a[], int n, int x)
{
int left = 0, right = n-1, middle = 0;
int tmp = 0;
while(left <= right)
{
middle = (left + right)/2;
tmp = a[middle];
if(x < tmp) right = middle - 1;
else if(x > tmp) left = middle + 1;
else return middle;
}
return -1;
}
乍看没有错误,但是不幸的是,该程序存在一个bug。当数组极大时,(left+right)可能为负数,则数组下标溢出,程序崩溃。
解决的方案:将middle=(left+right)/2改为middle=left+(right-left)/2即可。即利用减法代替加法,从而消除上溢。
参考自《代码之美》
[cpp] view
plaincopyprint?
//a为排好序的数组,n为数组的大小,x为指定元素
int binarySearch(int a[], int n, int x)
{
int left = 0, right = n-1, middle = 0;
int tmp = 0;
while(left <= right)
{
middle = (left + right)/2;
tmp = a[middle];
if(x < tmp) right = middle - 1;
else if(x > tmp) left = middle + 1;
else return middle;
}
return -1;
}
乍看没有错误,但是不幸的是,该程序存在一个bug。当数组极大时,(left+right)可能为负数,则数组下标溢出,程序崩溃。
解决的方案:将middle=(left+right)/2改为middle=left+(right-left)/2即可。即利用减法代替加法,从而消除上溢。
参考自《代码之美》
相关文章推荐
- 二分查找容易忽略的一个bug
- python安装第三方包之后无法导入相应模块(一个容易忽略的bug)
- 二分查找容易忽略的一个bug
- 一个简单但又让人容易忽略的BUG
- 页面回发,一个容易被忽略的问题!
- 使用JNDI的一个容易忽略的错误
- 一个容易忽略的问题-- 调用ServiceDescriptionImporter出错
- hdu 1011 树dp还是容易理解的,不过在做这个题的时候把一个边界条件给忽略了,以后得注意
- 一个容易被大家忽略的多线程性能优化方案:Cache行级别优化
- ORACLE 分组之后容易被忽略的bug
- 关于指向结构体的指针——又一个指针用法中容易忽略的问题
- 新手在sae部署程序容易忽略的一个细节
- 一个容易忽略的问题
- 链接选项rpath,容易被忽略的一个功能
- mongodb 多机部署时的容易忽略的一个要点
- 探讨使用外联接(OUTER JOIN)联接两表时容易忽略的一个小问题
- Anjuta IDE 下调试程序容易忽略的一个问题
- android——ListView的item容易忽略的一个小错误
- 一个容易忽略的优先级问题
- 关于oracle sql优化的一个容易忽略的问题。