首页 > 其他分享 >二分查找的改进

二分查找的改进

时间:2024-01-31 11:01:34浏览次数:26  
标签:二分 arr target int 位置 mid 改进 查找 右边

public static int binarySearch(int[] arr,int target){
  //设置左边位置
  int left=0;
  //设置右边位置
  int right=arr.length-1;
  //循环条件:如果左边位置小于等于右边位置
  while(left<=right){
    //中间位置等于(左边+右边)/2
    int mid =(right+left)>>>1;
    //如果目标等于中间位置就返回
    if(arr[mid]==target){
      return mid;
    }else if(arr[mid]<target){
      //如果中间位置小于目标位置
      //左边位置等于中间位置+1
      left=mid+1;
    }else if(arr[mid]>target){
      //如果中间位置大于目标位置
      //右边位置等于中间位置-1
      right=mid-1;
    }
  }
  //如果没有找到就返回 -1
  return -1;
}

原二分查找如果元素在最左边和元素在最右边的情况的循环次数差了1倍

改进后

public static int binarySearch2(int[] a ,int target){
        //设置左边位置
        int i=0;
        //设置右边位置
        int j=a.length;
        //循环条件:至少还有两个或以上的元素可以继续查找
        while(1<j-i){
            //中间位置等于(左边+右边)/2
            int m=(i+j)>>1;
            //如果目标小于中间位置,右边位置等于中间位置
            if(target<a[m]){
                j=m;
            }else{
                //否则,左边位置等于中间位置
                i=m;
            }
        }
        if(a[i]==target){
            //如果找到了,i就是索引位置
            return i;
        }else{
            //找不到就返回-1
            return -1;
        }
    }

1.左闭右开的区间,i指向的可能是目标,而j指向的不是目标
2.不在循环内找出,而是等范围内只剩下i时,退出循环,在循环外比较a[i]与target
3.循环内的平均比较次数减少了
4.时间复杂度都是⊙(㏒(n))
缺点是:最好的情况时的时间复杂度由O(1)变为了⊙(㏒(n))

标签:二分,arr,target,int,位置,mid,改进,查找,右边
From: https://www.cnblogs.com/zhao-zong-yu-hai/p/17998777

相关文章

  • Langchain中改进RAG能力的3种常用的扩展查询方法
    有多种方法可以提高检索增强生成(RAG)的能力,其中一种方法称为查询扩展。我们这里主要介绍在Langchain中常用的3种方法查询扩展技术涉及对用户的原始查询进行细化,以生成更全面和信息丰富的搜索。使用扩展后的查询将从向量数据库中获取更多相关文档。1、StepBackPromptingTake......
  • 随机二分
    思想随机二分即随机在当前的二分区间内找出一个元素作为\(mid\),并和普通二分一样收缩左右端点。由于每次合法区间长度期望折半,于是复杂度仍然正确,\(O(\logn)\)次收缩即可使区间中只有一个元素。在元素容易比较,容易求排名,而难以根据排名求元素时可以考虑随机二分。简单应用......
  • 二分查找(折半查找)
    二分查找的前提:数组中的数据必须是有序的核心思想:每次排除一半的数据,查询数据的性能明显提高很多实现步骤1.定义两个变量,一个代表左边位置,一个代表右边位置2.定义一个循环控制折半3.每次折半,都算出中间位置处的索引4.判断当前要找的元素值,与中间位置处的元素值的大小情况往......
  • KY27 查找学生信息C++
    用map做查找就行了。#include<iostream>#include<string>#include<map>usingnamespacestd;structnode{stringname;stringx;intage;};typedefstructnodesinfo;intmain(){intn;while(cin>>n){map<......
  • 基于注意力机制与改进TF-IDF的推荐算法
    前言本篇文章是2020年8月发表于《计算机工程》的一篇期刊论文,文章名称《基于注意力机制与改进TF-IDF的推荐算法》。文章针对传统推荐系统主要依赖用户对物品的评分数据而无法学习到用户和项目的深层次特征的问题,提出基于注意力机制与改进TF-IDF的推荐算法(AMITI)。将双层注意力......
  • AtCoder Beginner Contest 338 c题二分思路
    观察题目可知,会有一个最大的x(两个菜的最大制作数),大于这个x就不能做任何一盘菜,小于这个x那么一定可以做出来,这样分析就是显而易见的递归。实现递归的check函数,那么我们就可以把两个菜的总制作数传进去。那么什么时候true什么时候false呢,就是判断每种材料的制作量有没有超过原材料......
  • Leetcode刷题第五天-二分法-回溯
    215:第k个最大元素链接:215.数组中的第K个最大元素-力扣(LeetCode)em~~怎么说呢,快速选择,随机定一个目标值,开始找,左边比目标小,右边比目标大,左右同时不满足时,交换左右位置,直到左指针比右指针大,交换目标和右指针位置的值,此时右指针位置即时目标值的在排序好数组中的位置,如果k在右......
  • 传统Item-Based协同过滤推荐算法改进
    前言今天要读的论文为一篇于2009年10月15日发表在《计算机研究与发展》的一篇会议论文,论文针对只根据相似性无法找到准确可靠的最近邻这个问题,提出了结合项目近部等级与相似性求取最近邻的新方法;此外针对系统中新加入的项目,因为其上评分信息的匾乏,求得的最近邻往往是不准确的,为此......
  • 二分算法
    二分算法个人感想洛谷二分题单基本完成,发现二分确实是比较模板的方式解答题目,难点往往是寻找出答案的单调性和如何高效验证答案的正确性。二分个人感觉就是枚举的优化,在时间复杂度上的极大优化,有一种暴力的美.目前发现的不足对题目的理解太浅,有时很难看懂题目的意思,理解有问......
  • 【学习笔记】二分图
    1.定义一个二分图满足有一种划分方案使得它节点的被分为两部分,且所有边的端点所在的部分不相同。即每条边都连接两个部分。变量说明:没有特殊说明时,\(n\)表示a部分点数,\(m\)表示b部分点数,\(e\)表示边数。2.判定显然我们给二分图染色,确定一个点所有点都确定。如果在染的......