• 二分查找算法


    一,应用场景:有一个有序数组,想从里边找到某一个元素的位置

    二,有序且元素唯一的实现

    1.基础版
    1. public static int binary1(int[] a, int target) {
    2. int i = 0;
    3. int j = a.length - 1;
    4. while (i <= j) {
    5. int m = (i + j) >>> 1;
    6. if (target < a[m]) {
    7. j = m - 1;
    8. } else if (a[m] < target) {
    9. i = m + 1;
    10. } else {
    11. return m;
    12. }
    13. }
    14. return -1;
    15. }
    2.平衡版
    1. public static int binary2(int[] a, int target) {
    2. int i = 0;
    3. int j = a.length ;
    4. while (1
    5. int m = (i + j) >>> 1;
    6. if (target < a[m]) {
    7. j = m;
    8. }else {
    9. i= m;
    10. }
    11. }
    12. if (a[i]==target){
    13. return i;
    14. }
    15. return -1;
    16. }

    来说一下上边两种方案的区别:其实基础版已经可以解决大部分场景的问题了,那为什么出现平衡版呢,主要是当数组数据规模很大时候,减少了每次循环判断的条件,只在循环中去缩小范围,不去做具体的取值判断,因为我们知道如果数据规模很大,那么取中间索引刚好落在目标的可能就很小,所以我们干脆将这个权利剥夺掉,当范围缩小到最后时再去判断

    我们索引取中为什么采用>>>:为什么不用/2呢,假如数据数据量超过了整数可以表示的最大范围,那么i+1很有可能就会超过整数最大值,就会变为负数,因为java中不存在无符号整数,二进制最高位代表的是符号位,那这样的话负数/2肯定还是负数,因为这样操作不会改变最高位,如果我们使用>>>1可以达到同样效果的同时还防止了当超过范围变为负数后/2为负数的场景

  • 相关阅读:
    51单片机入门(一)
    JavaScript基础大总结
    开放式激光振镜运动控制器在动力电池模组连接片的焊接应用
    [答疑]是不是直接写“发红包”而不是“请求微信发红包”
    系统安全及其应用
    demo(一)eureka----服务注册与提供
    C#学习 - 事件
    11-2 集合之Collection接口
    vite 搭建双入口
    【KD】Transformer在各个研究领域的轻量化研究进展
  • 原文地址:https://blog.csdn.net/weixin_59244784/article/details/133253647