二分法(折半查找法)存在性问题

利用二分法(折半查找法)判断一个有序数组是否存在某个值

在这里插入图片描述

O(logn) 惊人的查找速度

假设数据大小是 n,每次查找后数据都会缩小为原来的一半,也就是会除以 2。最坏情况下,直到查找区间被缩小为空,才停止。

在这里插入图片描述

二分查找应用场景的局限性(只是在查找上)

  • 首先,二分查找依赖的是顺序表结构,简单点说就是数组。
  • 其次,二分查找针对的是有序数据。
  • 再次,数据量太小不适合二分查找。
  • 最后,数据量太大也不适合二分查找。
public class Code04_BSExit {
    // 利用二分法(折半查找法)判断一个有序数组是否存在某个值
    // 判断有序数组是否存在某个num
    public boolean bsearchExit(int[] sortedArr, int num) {
        // 判断数组为空就返回false
        if (sortedArr == null || sortedArr.length == 0) {
            return false;
        }
        int L = 0;// 左边下标
        int R = sortedArr.length - 1;// 右边下标
        int mid = 0;// 中间下标

        // 从左边到右边依次折半
        while (L < R) {
            // 1、算出中间位的下标位置
            // 传统方式:mid=(low+high)/2
            // 因为mid是一个int数,如果L=10亿 R=18亿,两数之和超过int最大值,因此会存在溢出隐患
            // 解决方法:mid=L+(R-L)/2 左右下标的差值的一半再加上L,就不会出现溢出问题
            // 再优化:mid=L+((R-L)>>1) 位运算比除运算快!
            mid = L + ((R - L) >> 1);
            //中间下标对应的值等于目标值就返回true
            if (sortedArr[mid] == num) {
                return true;
            }else if(sortedArr[mid]>num) {
                //比目标值大,就去左边找,右边下标左移一位
                R=mid-1;
            }else {
                //比目标值小,就去右边找,左边下标右移一位
                L=mid+1;
            }

        }
        //剩余1一个数,此时L==R,判断是否等于目标值即可
        return sortedArr[L]==num;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值