首页 > 其他分享 >二分查找——出现溢出问题

二分查找——出现溢出问题

时间:2023-05-07 21:36:29浏览次数:42  
标签:二分 边界 中间 int 索引 查找 array 溢出

算法描述:

  1. 前提:有已排序数组 A(假设已经做好)

  2. 定义左边界 L、右边界 R,确定搜索范围,循环执行二分查找(3、4两步)

  3. 获取中间索引 M = Floor((L+R) /2)

  4. 中间索引的值 A[M] 与待搜索的值 T 进行比较

    ① A[M] == T 表示找到,返回中间索引

    ② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1 设置为右边界,重新查找

    ③ A[M] < T,中间值左侧的其它元素都小于 T,无需比较,中间索引右边去找, M + 1 设置为左边界,重新查找

  5. 当 L > R 时,表示没有找到,应结束循环

代码实现:

public class BinarySearch {

   public static void main(String[] args) {
       int[] array = {1, 5, 8, 11, 19, 22, 31, 35, 40, 45, 48, 49, 50};
       int target = 48;
       int idx = binarySearch01(array, target);
       System.out.println(idx);

  }

   /**
    * 1. 前提:有已排序数组 A(假设已经做好)
    * 2. 定义左边界 L、右边界 R,确定搜索范围,循环执行二分查找(3、4两步)
    * 3. 获取中间索引 M = Floor((L+R) /2)
    * 4. 中间索引的值 A[M] 与待搜索的值 T 进行比较
    * ① A[M] == T 表示找到,返回中间索引
    * ② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1 设置为右边界,重新查找
    * ③ A[M] < T,中间值左侧的其它元素都小于 T,无需比较,中间索引右边去找, M + 1 设置为左边界,重新查找
    * 5. 当 L > R 时,表示没有找到,应结束循环
    *
    * @param array
    * @param target
    * @return
    */
   private static int binarySearch01(int[] array, int target) {
       int L = 0, R = array.length - 1, M;
       while (L <= R) {
           M = (L + R) / 2;
           if (array[M] == target) {
               return M;
          } else if (array[M] > target) {
               R = M - 1;
          } else {
               L = M + 1;
          }
      }
       return -1;
  }
}

出现整数溢出实例:

假设a为左边界索引,b为右边界索引,且为整数最大值-1,c为中间索引

        int a = 0;
       int b = Integer.MAX_VALUE-1;
       int c = (a+b)/2;
       // 假设目标值在中间索引的右边
       // 重新设置中间索引,此时出现整数溢出
       c = (c+1+b)/2;
       System.out.println(c);

打印出c的值为:-536870913

解决溢出:

方法一:

将 M = (L + R) / 2; 将改成:M = L+(R-L)/2;

方法二:

 M = (L + R) / 2; 

根据位运算可以改写成:

M = (L + R) >>>1
 

标签:二分,边界,中间,int,索引,查找,array,溢出
From: https://www.cnblogs.com/xiejixiang/p/17380199.html

相关文章

  • 如何在Linux中查找一个文件
    《Linux就该这么学》-必读的Linux系统与红帽RHCE认证免费自学书籍免费电子版下载地址:https://www.linuxprobe.com/book导读对于新手而言,在Linux中使用命令行可能会非常不方便。没有图形界面,很难在不同文件夹间浏览,找到需要的文件。本篇教程中,我会展示如何在Linux中查找特......
  • 【二分查找】LeetCode 33. 搜索旋转排序数组思路
    题目链接33.搜索旋转排序数组思路思路都在注释里代码classSolution{publicintsearch(int[]nums,inttarget){intlen=nums.length;if(len==0){return-1;}intleft=0,right=len-1;//1.......
  • 【二分查找】LeetCode 528. 按权重随机选择
    题目链接528.按权重随机选择思路代码classSolution{privateint[]sum;publicSolution(int[]w){sum=newint[w.length+1];for(inti=1;i<sum.length;i++){sum[i]=sum[i-1]+w[i-1];}}p......
  • 【二分查找】LeetCode 69. x 的平方根
    题目链接69.x的平方根思路基本思路是在区间\([1,x/2]\)中使用二分查找(因为平方根必然小于\(x/2\)),只不过需要注意一些细节。因为使用的是闭区间查找,所以判断循环终止的条件为\(left\leqright\)。为了防止溢出,使用mid=(right-left)/2+left和mid==x/mi......
  • 【二分查找】LeetCode 540. 有序数组中的单一元素
    题目链接540.有序数组中的单一元素思路假如不存在单个的元素,那么在奇数位置上总是成对元素的第一个元素,偶数位置上总是成对元素的第二个元素,但是如果加入了单个元素呢?我们可以看到在单个元素的左边这个特点没有变化,但是在单个元素的右边,奇数位置上总是成对元素的第二个元素,偶......
  • 用Python vc2 在大图中查找小图
    importcv2importtimedeffind_image_location(small_image_path,large_image_path):  #Loadimages  small_image=cv2.imread(small_image_path)  large_image=cv2.imread(large_image_path)  #Findmatchusingtemplatematching  result......
  • 查找某物质的热力学数据并转换为chemkin数据格式
    在使用CHEMKIN时,其库中的热力学数据有时无法满足需求,需要自行查询物质的热力学数据并编写热力学文件,本文将以B2O3为例子描述查找到转换热力学数据的整个过程。查找热力学数据进入NIST的热力学数据库网站http://webbook.nist.gov/chemistry/form-ser.html输入化学式,使用Calo......
  • CSS实现单行、多行文本溢出显示省略号
    代码单行文字溢出打点div{width:100px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}多行文字溢出打点div{width:100px;overflow:hidden;text-overflow:ellipsis;......
  • LeetCode 704. 二分查找 题解
    本题考查的就是一个基本的整数二分查找问题对于整数二分,有单调性一定可以二分,没有单调性的有时候也可以二分。算法思想(分为两种方法):查找结果是在左边区间的情况区间被划分为[l,mid]和[mid+1,r]1、确定分界点,mid=q[(l+r)/2]2、判断是否满足是:区间变成[l,mid]因此:r=mid否......
  • Linux下查找Nginx配置文件位置
    1、查看Nginx进程ps-aux|grepnginx圈出的就是Nginx的二进制文件2、测试Nginx配置文件/usr/sbin/nginx-t可以看到nginx配置文件位置3、nginx的使用(启动、重启、关闭)首先利用配置文件启动nginx。nginx-c/usr/local/nginx/conf/nginx.conf重启服务:servicenginx......