二分查找-图文详解,看不懂你来打我。。。

一、查找算法

在计算机科学和算法领域,搜索是一项基本的任务。在海量数据中寻找特定的元素是一项常见的任务,而二分查找(Binary Search)是一种非常高效的搜索算法,特别适用于有序数组。

二、二分查找

二分查找是一种常用的查找算法。在有序数组中查找目标元素时,二分查找通过将数组分成两部分,然后判断目标元素在哪一部分中,从而缩小查找范围,提高查找效率。

二分查找的基本思想是:

  1. 首先确定数组的中间位置mid。

  2. 将目标元素与mid位置的元素进行比较。

  3. 如果目标元素等于mid位置的元素,则查找成功。

  4. 如果目标元素小于mid位置的元素,则在左半部分继续进行二分查找。

  5. 如果目标元素大于mid位置的元素,则在右半部分继续进行二分查找。

  6. 重复以上步骤,直到找到目标元素或者确定目标元素不存在。

二分查找的时间复杂度为O(logn),其中n为数组的长度。由于每次都将查找范围缩小一半,因此效率较高。

三、例子

假设我们有一组数据为{1,2,3,4,5,6,7};

需要查找的元素为:6.

第一步:定义两个指针i和j,将i的值赋值为0,j的值赋值为数组的长度-1,中间元素m的下标为(0+6)/2 =3,这里请注意,下标为3对应的数字为4哦,不要搞混了。

图片

第二步:将中间的数比较我们想要查找的目标数字6,我们发现4<6,证明我们需要找的数在数字的右边部分,所以我们将i=m+1=3+1=4, j不变,所以m = ( i + j ) / 2=5。

图片

第三步:我们通过比较发现下标为5对应的数字6跟我们的目标数字相等,所以我们返回m。这样我们就查到了数据。

以下是另外一个示例过程,

假设我们有一个升序数组arr = {1, 3, 5, 7, 9},并且我们按顺序查找数字1到2。

查找数字1:

l 初始时,i = 0,j = 4,计算m = (0 + 4) / 2 = 2。

l 因为arr[m] = 5大于目标值1,所以更新j = m - 1 = 1。

l 下一轮,m = (0 + 1) / 2 = 0。

l 因为arr[m] = 1等于目标值1,查找成功,返回索引m = 0。

查找数字2:

l 初始时,i = 0,j = 4,计算m = (0 + 4) / 2 = 2。

l 因为arr[m] = 5大于目标值2,所以更新j = m - 1 = 1。

l 下一轮,m = (0 + 1) / 2 = 0。

l 因为arr[m] = 1小于目标值2,所以更新i = m + 1 = 1。

l 但此时i已经大于j,说明目标值2不在数组中,查找失败,返回-1。

Java代码:(左闭合右闭合)

public static int binarySearch(int[] a, int target) {
int i = 0, j = a.length - 1;
while (i <= j) {
int m = (i + j) >>> 1;
if (target < a[m]) { // 在左边
j = m - 1;
} else if (a[m] < target) { // 在右边
i = m + 1;
} else {
return m;
}
}
return -1;
}
注意:>>> 为无符号右移,就是将左操作数计算为无符号数,并将该数字的二进制表示形式移位为右操作数指定的位数,取模 32。向右移动的多余位将被丢弃,零位从左移入。其符号位变为 0,因此结果始终为非负数。与其他按位运算符不同,零填充右移返回一个无符号 32 位整数。

在这里使用无符号右移而不使用÷2操作是为了防止数据过大导致溢出。

例如:举个例子,现在假设我们有一个需要查找的数组a, a的长度比较大,为int的最大值也就是Integer.MAX_VALUE,我们假设我们要找的目标参数在右边,也就是i指针下一次指向Integer.MAX_VALUE/2。我们看看实际运行效果。我们可以看到,m的值竟然算出了负数,一个数组的下标很显然是不会等于负数的。所以我们需要使用>>>无符号右移符号。

图片

Java代码:

public class test {
public static void main(String[] args) {
int a = Integer.MAX_VALUE ;
int i = a/2;
int m =(a+i)/2;
int n = (a+i) >>> 2;
System.out.println(“a:”+a);
System.out.println(“m:”+m);
System.out.println(“m:”+n);
}

}
二分查找的另一种写法

Java代码:(左闭合右开[i, j))

public static int binarySearch(int[] a, int target) {
int i = 0, j = a.length;
while (i < j) {
int m = (i + j) >>> 1;
if (target < a[m]) { // 在左边
j = m;
} else if (a[m] < target) { // 在右边
i = m + 1;
} else {
return m;
}
}
return -1;
}
注意比较:j = a.length, while (i < j) , j = m;这三个地方的不一样。

图片

作者介绍

一个热爱编程,无背景最底层的程序员。没人领路遇到过很多坑,希望能分享一下自己的经验,让后续的小伙伴们少走弯路!关注我,带你了解更多的企业真实情况!水平有限,如果有写错的地方请大家指正。需要数据结构资料的小伙伴请关注公众号回复:数据结构。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/305320.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ctf_show笔记篇(web入门---SSRF)

ssrf简介 ssrf产生原理&#xff1a; 服务端存在网络请求功能/函数&#xff0c;例如&#xff1a;file_get_contens()这一类类似于curl这种函数传入的参数用户是可控的没有对用户输入做过滤导致的ssrf漏洞 ssrf利用: 用于探测内网服务以及端口探针存活主机以及开放服务探针是否存…

常用的深度学习自动标注软件

0. 简介 自动标注软件是一个非常节省人力资源的操作&#xff0c;而随着深度学习的发展&#xff0c;这些自动化标定软件也越来越多。本文章将会着重介绍其中比较经典的自动标注软件 1. AutoLabelImg AutoLabelImg 除了labelimg的初始功能外&#xff0c;额外包含十多种辅助标注…

Java+BS +saas云HIS系统源码SpringBoot+itext + POI + ureport2数字化医院系统源码

JavaBS saas云HIS系统源码SpringBootitext POI ureport2数字化医院系统源码 医院云HIS系统是一种运用云计算、大数据、物联网等新兴信息技术的业务和技术平台。它按照现代医疗卫生管理要求&#xff0c;在特定区域内以数字化形式收集、存储、传递和处理医疗卫生行业的数据。通…

llama-factory SFT系列教程 (一),大模型 API 部署与使用

文章目录 背景简介难点 前置条件1. 大模型 api 部署下一步阅读 背景 本来今天没有计划学 llama-factory&#xff0c;逐步跟着github的文档走&#xff0c;发现这框架确实挺方便&#xff0c;逐渐掌握了一些。 最近想使用 SFT 微调大模型&#xff0c;llama-factory 是使用非常广泛…

java八股——消息队列MQ

上一篇传送门&#xff1a;点我 目前只学习了RabbitMQ&#xff0c;后续学习了其他MQ后会继续补充。 MQ有了解过吗&#xff1f;说说什么是MQ&#xff1f; MQ是Message Queue的缩写&#xff0c;也就是消息队列的意思。它是一种应用程序对应用程序的通信方法&#xff0c;使得应用…

【Java+Springboot】------ 通过JDBC+GetMapping方法进行数据select查询、多种方式传参、最简单的基本示例!

一、JDBC如何使用、PostGresql数据库 1、在pom.xml 先引用jdbc组件。 <!--jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency> 2、在pom.xml 再引用p…

每天学点儿Python(6) -- 列表和枚举

列表是Python中内置的可变序列&#xff0c;类使用C/C中的数组&#xff0c;使用 [ ] 定义列表&#xff0c;列表中的元素与元素之间用英文逗号&#xff08; , &#xff09;分隔&#xff0c; 但是Python中列表可以存储任意类型的数据&#xff0c;且可以混存&#xff08;即类型可以…

Spring项目的创建和简单使用

目录 一.Spring项目的创建 二.存储Bean 2.1创建Bean对象 2.2Bean注入 三.读取Bean 3.1得到Spring上下文 3.2获取指定Bean对象 3.3为什么不使用new呢&#xff1f; 四.获取Bean的三种方式 4.1 BeanFactory类 4.2两者区别 4.3获取Bean的优化操作 五.总结 一.Spring项目…

海山数据库(He3DB)Redis技术实践:继承开源Redis精髓,强化升级企业级服务

数字化转型中的企业数据的处理速度和效率直接关系到企业的竞争力&#xff0c;Redis作为业界广泛使用的开源键值对存储系统&#xff0c;以其卓越的性能和丰富的数据结构&#xff0c;成为了众多开发者和企业的首选。然而&#xff0c;近期Redis开源社区对Redis协议进行了变更&…

基于SSM+Jsp+Mysql的快递管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

工作流引擎常见API(以camunda为例)

在Camunda中&#xff0c;API的继承关系主要体现在各个服务接口之间。以下是Camunda中一些常见服务接口的继承关系&#xff1a; ProcessEngineServices 接口&#xff1a; RepositoryService&#xff1a; 负责管理流程定义和部署。RuntimeService&#xff1a; 负责管理流程实例的…

植物大战僵尸Python版,附带源码注解

目录 一、实现功能 二、安装环境要求 三、如何开始游戏 四、怎么玩 五、演示 六、部分源码注释 6.1main.py 6.2map.py 6.3Menubar.py 七、自定义 7.1plant.json 7.2zombie.json 一、实现功能 实施植物&#xff1a;向日葵、豌豆射手、壁桃、雪豆射手、樱桃炸弹、三…

Linux下批量的批量操作

批量删除docker 镜像 docker images | grep ent-form-web |awk ‘{print $3}’ | xargs docker rmi docker images: 列出所有的docker 镜像 docker images | grep ent-form-web : 选取出结果带 ent-form-web的信息 docker images | grep ent-form-web |awk ‘{print $3}’ 选取…

YOLOv5实战记录05 Pyside6可视化界面

个人打卡&#xff0c;慎看。 指路大佬&#xff1a;【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决 yolov5-master文件夹我换位置后&#xff0c;无法pip install了。解决如下&#xff1a; activate.bat中修改…

wsl 2在windows11上的设置

详细参考&#xff1a;Manual installation steps for older versions of WSL | Microsoft Learn 1.系统组件要打开 分别是&#xff1a;Hyper-V、虚拟机平台、适用于Windows的Linux子系统 2.以管理员方式运行命令行&#xff0c;逐步执行下面的命令 update to WSL 2, you must…

js爬虫puppeteer库 解决网页动态渲染无法爬取

我们爬取这个网址上面的股票实时部分宇通客车(600066)_股票价格_行情_走势图—东方财富网 我们用正常的方法爬取会发现爬取不下来&#xff0c;是因为这个网页这里是实时渲染的&#xff0c;我们直接通过网址接口访问这里还没有渲染出来 于是我们可以通过下面的代码来进行爬取: …

PowerJob 分布式任务调度简介

目录 适用场景 设计目标 PowerJob 功能全景 任务调度 工作流 分布式计算 动态容器 什么是动态容器? 使用场景 可维护性和灵活性的完美结合 实时日志&在线运维 PowerJob 系统组件 PowerJob 应用场景 PowerJob 的优势 PowerJob&#xff08;原OhMyScheduler&…

无法用raven-js,如何直接使用TraceKit标准化错误字符串(一次有趣的探索)

引子&#xff1a;网上三年前&#xff08;2020&#xff09;的文章介绍了一个raven-js 简单说就是把堆栈信息格式化兼容各浏览器&#xff0c;便于查看错误来源。 **but&#xff1a;**到处找了一下raven-js&#xff0c;已经没有官方出处了&#xff0c;只在Sentry的源码仓库里发现…

Docker使用— Docker部署安装Nginx

Nginx简介 Nginx 是一款高性能的 web 服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3/SMTP&#xff09;代理服务器&#xff0c;由俄罗斯开发者伊戈尔塞索耶夫&#xff08;Igor Sysoev&#xff09;编写&#xff0c;并在2004年10月4日发布了首个公开版本0.1.0。Nginx…

简单了解JVM

一.JVM简介 jvm及Java virtual machineJava虚拟机&#xff0c;它是一个虚构出来的计算机&#xff0c;一种规范。其实抛开这么专业的句子不说&#xff0c;就知道 JVM 其实就类似于一台小电脑运行在 windows 或者 linux 这些操作系统环境下即可。它直接和操作系统进行交互&#…