美文网首页
二分查找int溢出问题

二分查找int溢出问题

作者: Tomy_Jx_Li | 来源:发表于2018-06-05 16:23 被阅读14次

二分查找时中间有一步操作就是求取中间值,一般写法为mid = (min + max) / 2,但是这种写法存在问题。原因:min可能不断增大,如果到极限状态,也就是min达到了max-1的地步的时候刚好数组的长度又很大,那么就可能导致min + max的溢出,所以需要改进。

改进一:mid = (max - min) / 2 + min;
改进二:((max - min) >>> 1) + min; 逼格更高
附上源码:

 public static int binary(int[] arr, int data) {
        int min = 0;
        int max = arr.length - 1;
        int mid;
        while (min <= max) {
            // 二分查找时这种写法,在数据量很大的时候可能会导致int类型溢出。
            // 原因:min可能不断增大,如果到极限状态,比如min达到了max-1的地步的时候
            // 刚好数组的长度又很大,那么就可能导致min + max的溢出,所以需要改进
            // mid = (min + max) / 2;
            // 这种写法就可以了,不过下面的逼格更高点
            // mid = (max - min) / 2 + min;
            // 无符号位运算符的优先级较低,所以括起来
            mid = ((max - min) >>> 1) + min;

            if (arr[mid] > data) {
                max = mid - 1;
            } else if (arr[mid] < data) {
                min = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

相关文章

  • 二分查找模式

    二分查找通用的模板int mid = (left + right) / 2容易溢出 二分查找的通用模板 使用“左边...

  • 二分查找int溢出问题

    二分查找时中间有一步操作就是求取中间值,一般写法为mid = (min + max) / 2,但是这种写法存在问题...

  • rust练习-5

    总结 二分查找,容易溢出 用 u64String chars next 遍历,match匹配值String int...

  • LeetCode374.猜数字大小

    原题链接 二分查找法,但是要注意一个溢出的问题,因为给定的函数接口是int类型,所以定义成long long 也不...

  • 69. Sqrt(x)

    思路:从1 - x 查找 res * res = x; 可以采用二分查找的算法。注意溢出问题。当left <= ...

  • 排序、查找算法

    1.二分法查找(递归) public int static binarySearch(int low ,int h...

  • 二分查找(有序数组)

    二分查找 有序数组 int mid = (low + high)/2; if (a [mid] == key) {...

  • 算法入门(4)奶牛二分

    疯牛问题的二分贪心算法:加入二分查找速度快了不少。这里把r的最大值设置为: int((N[-1] - N[0])/...

  • 二分法

    传统的二分查找模板的问题 尽量使用int mid=left+(right-left)>>1; 循环可以进行的条件写...

  • 二分法查找

    二分法查找:前提条件:数组必须是有序数组 int findVlaue = intValue; int min = ...

网友评论

      本文标题:二分查找int溢出问题

      本文链接:https://www.haomeiwen.com/subject/tgyysftx.html