博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分查找及其扩展
阅读量:4093 次
发布时间:2019-05-25

本文共 1799 字,大约阅读时间需要 5 分钟。

#二分查找及其扩展#

  • 二分查找法
    • 时间复杂度
      • O(logn)
    • 实现
      • 递归
public int binarySearchV2(int[] a,int low,int high,int value) {        if(low>high) return -1;        while (low<=high){            int mid = (low+high)/2;            if(a[mid]  == value){                return mid;            }else if(a[mid] > value){               return binarySearchV2(a,low,high-1,value);            }else {               return binarySearchV2(a,mid+1,high,value);            }        }			return -1;    }
- **非递归**
public int binarySearchV1(int[] a,int n,int value){       int low = 0;       int high = n-1;       while(low<=high){           int mid = (low+high)/2;           if(a[mid] == value){               return mid;           }else if(a[mid]>value){               high = mid - 1;           }else{               low = mid+1;           }       }       return -1;    }
  • 注意点
    • 退出循环的条件是low <= high
    • (low+high)容易溢出 改为 low+(high-low)/2 ==> >>1
    • low 和 high的更新
  • 扩展
    • 顺序访问及查找
    • 基于数组
    • 数据量太大不适合,数据量太小也不适合
  • 相关变形题目
    • 查找第一个值等于给定值的元素
    • 查找最后一个值等于给定值的元素
    • 查找第一个大于等于给定值的元素
    • 查找最后一个小于等于给定值的元素
  • 分析
    • 以上几个都是二分查找的变形题目,需要学会举一反三,相信大部分人一看代码马上就能懂了
/**     * 获取第一个等于给定值的值     * */    public static int getFisrtEquals(int[] a,int n,int value){        int low = 0;        int high = n-1;        while(low <= high){            int mid = low + ((high-low)>>1);            if(a[mid] >value){                high = mid-1;            }else if(a[mid] 
>1); if(a[mid] >value){ high = mid -1; }else if(a[mid]
>1); if(a[mid]
>1); if(a[mid]>value){ high = mid-1; }else{ // 应该就比较好理解了 if(mid==n || a[mid+1]>value) return mid; else low=mid+1; } } return -1; }
  • 想要写出一个 bug free的二分查找也不容易,需要考虑 循环的终止条件,区间的上下界值的选择以及返回值的选择

转载地址:http://chiii.baihongyu.com/

你可能感兴趣的文章
被 Zoom 逼疯的歪果仁,造出了视频会议机器人,同事已笑疯丨开源
查看>>
上古语言从入门到精通:COBOL 教程登上 GitHub 热榜
查看>>
再见,Eclipse...
查看>>
超全汇总!B 站上有哪些值得学习的 AI 课程...
查看>>
如果你还不了解 RTC,那我强烈建议你看看这个!
查看>>
神器面世:让你快速在 iOS 设备上安装 Windows、Linux 等操作系统!
查看>>
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
太赞了!GitHub 标星 2.4k+,《可解释机器学习》中文版正式开放!
查看>>
程序员用 AI 修复百年前的老北京视频后,火了!
查看>>
漫话:为什么你下载小电影的时候进度总是卡在 99% 就不动了?
查看>>
我去!原来大神都是这样玩转「多线程与高并发」的...
查看>>
当你无聊时,可以玩玩 GitHub 上这个开源项目...
查看>>
B 站爆红的数学视频,竟是用这个 Python 开源项目做的!
查看>>
安利 10 个让你爽到爆的 IDEA 必备插件!
查看>>
自学编程的八大误区!克服它!
查看>>
GitHub 上的一个开源项目,可快速生成一款属于自己的手写字体!
查看>>
早知道这些免费 API,我就可以不用到处爬数据了!
查看>>
Java将Object类型对象转换为指定的实体类对象
查看>>
Mysql中不同字段类型对应的Java类型
查看>>
使用Gson判断两个Json字符串是否相等
查看>>