折半(二分查找)中,使用int mid = low+((high-low)>>>1)的原因

zhuyuuyuhz 2015-10-05 11:24:42
有人说若使用(low+high)/2求中间位置容易溢出,但是我们已经定义了int low = 0;int high = Array.length-1;并不存在地址相加的问题,只是数组下标相加的问题,为什么还会有溢出等问题呢?

public static int binSearch(int[] Array,int key){
int low = 0;
int high = Array.length-1;
while(low<=high){
int mid = low+((high-low)>>>1); //右移一位,相当于除以2,但右移的运算速度更快
//若使用(low+high)/2求中间位置容易溢出
System.out.println("打印low:"+low);
if(key == Array[mid])
return mid;
else if(key > Array[mid])
low = mid+1;
else if(key < Array[mid])
high = mid-1;

}
return -1;
}
...全文
1082 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
beishitou 2016-10-16
  • 打赏
  • 举报
回复
所以能不能有哪位朋友说说怎么防止这样的溢出?非常感谢。
u010262841 2015-12-09
  • 打赏
  • 举报
回复
你只定义了low的初始值是0。往下看,循环以后,low的值有可能变成mid+1。就是这一句: else if(key > Array[mid]) low = mid+1; 然后再拿low运算的时候,就有可能溢出。当然,那是数据量非常大的时候。
qq_30676355 2015-10-06
  • 打赏
  • 举报
回复
以下是我个人的理解: int型数据,java里除号是下取整的,二分法,你mid有不断增加的可能,加法就容易溢出,超过int型数据的表达范围,比如计算2个32位的数字,加法结果为64位,但是制定了数据类型为32位,结果就只能读这个64位数的低32位,这就是溢出。 有可能二分查找到数组的最后两个,如果数组的长度非常大,就有可能溢出 如果你要在数量为十亿级别数据库中查找,就要考虑这个溢出。
zhuyuuyuhz 2015-10-06
  • 打赏
  • 举报
回复
但我现在给low和high定义了
int low = 0;int high = Array.length-1
所以他们的长度范围是0~Array.length,应该不会超过Array.length 的长度范围,怎么可能溢出?

50,639

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧