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

news2024/11/30 2:37:31

一、查找算法

在计算机科学和算法领域,搜索是一项基本的任务。在海量数据中寻找特定的元素是一项常见的任务,而二分查找(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.coloradmin.cn/o/1586422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【阿里淘天笔试题汇总】2024-04-10-阿里淘天春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新淘天近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…

【前端Vue】Vue3+Pinia小兔鲜电商项目第5篇:整体认识和路由配置,本资源由 收集整理【附代码文档】

Vue3ElementPlusPinia开发小兔鲜电商项目完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;认识Vue3&#xff0c;使用create-vue搭建Vue3项目1. Vue3组合式API体验,2. Vue3更多的优势,1. 认识create-vue,2. 使用create-vue创建项目,1. setup选项的写法和执行…

基于Springboot的箱包存储系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的箱包存储系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

linux的io的知识大全

C语言的io操作 写文件 #include<stdio.h> #include<string.h>#define FILE_NAME "log.txt" int main() {FILE * fp fopen(FILE_NAME, "w");if(fpNULL){printf("fopen error!\n");}const char* msg "hello zk\n";int c…

【复现】浙大恩特客户资源管理系统 SQL注入漏洞_71

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源&#xff0c;提升…

Golang 基于共享变量的并发锁

一、互斥锁 先看一个并发情况&#xff0c;同时操作一个全局变量&#xff0c;如果没有锁会怎么样 假设有1000个goroutines并发进行银行余额的扣除&#xff0c;每次都扣除10元&#xff0c;起始的总余额是10000&#xff0c;理论上并发执行完应该是0对不对&#xff0c;但实际却不…

GeoServer:忘记密码重置

操作步骤 1. 找到data_dir/security/usergroup/default目录下的users.xml文件&#xff0c; 2.修改password为plain:geoserver&#xff0c; 这里无论原来的密码是什么&#xff0c;改为plain:geoserver之后&#xff0c;就可以通过admin&#xff1a;geoserver默认账户密码登录了。…

RAG应用开发实战(01)-RAG应用框架和解析器

1 开源解析和拆分文档 第三方的工具去对文件解析拆分&#xff0c;去将我们的文件内容给提取出来&#xff0c;并将我们的文档内容去拆分成一个小的chunk。常见的PDF word mark down, JSON、HTML。都可以有很好的一些模块去把这些文件去进行一个东西去提取。 优势 支持丰富的文…

电商新宠:淘宝拍立淘API接口助力精准搜索商品信息

淘宝拍立淘API接口&#xff0c;作为电商领域的新宠&#xff0c;正以其独特的图像识别技术为精准搜索商品信息提供强大的助力。这项基于深度学习和计算机视觉技术的先进服务&#xff0c;使得用户能够通过上传图片来快速搜索淘宝平台上的相关商品&#xff0c;极大地提升了购物体验…

鸿蒙让我赚到了第一笔桶金!年薪33.6W!

抢人&#xff01;抢人&#xff01;抢人&#xff01; 所谓抢滩鸿蒙&#xff0c;人才先行。鸿蒙系统火力全开后&#xff0c;抢人已成鸿蒙市场的主题词&#xff01; 智联招聘数据显示&#xff0c;春节后首周&#xff0c;鸿蒙相关职位数同比增长163%&#xff0c;是去年同期的2.6倍…

分布式锁-redission可重入锁原理

5.3 分布式锁-redission可重入锁原理 在Lock锁中&#xff0c;他是借助于底层的一个voaltile的一个state变量来记录重入的状态的&#xff0c;比如当前没有人持有这把锁&#xff0c;那么state0&#xff0c;假如有人持有这把锁&#xff0c;那么state1&#xff0c;如果持有这把锁的…

RX8901CE可在最高+105℃工作温度下工作,助力光伏逆变器稳定运行

光伏逆变器是一种由半导体器件组成的电力调整装置&#xff0c;主要用于把直流电力转换成交流电力。一般由升压回路和逆变桥式回路构成&#xff0c;而且很多时候会配有储能单元进行峰谷电压平整。作为光伏电站中关键的部件&#xff0c;光伏逆变器的可靠运行影响着整个光伏电站的…

ubuntu如何截图? ubuntu中截屏的三种方法

文章目录 1.ubuntu主要用途2.ubuntu如何截图&#xff1f;2.1 方法一&#xff1a;键盘按键快捷键截屏 2.2 方法二&#xff1a;系统自带软件2.3 方法三&#xff1a;第三方软件 Reference 1.ubuntu主要用途 1、桌面操作系统&#xff1a;Ubuntu可用作个人电脑或笔记本电脑的操作系…

树形查找试题(二叉树、红黑树)

一、单项选择题 01.对于二叉排序树&#xff0c;下面的说法中&#xff0c;()是正确的。 A.二叉排序树是动态树表&#xff0c;查找失败时插入新结点&#xff0c;会引起树的重新分裂和组合 B.对二叉排序树进行层序遍历可得到有序序列 C.用逐点插入法构造二叉排序树&#xff0c;若先…

批归一化(BN)在神经网络中的作用与原理

文章目录 1. 批归一化&#xff08;BN&#xff09;在神经网络中的作用与原理1.1 作用与优势1.2 原理与推导 2. 将BN应用于神经网络的方法2.1 训练时的BN 2. 将BN应用于神经网络的方法2.1 训练时的BN2.2 测试时的BN代码示例&#xff08;Python&#xff09;&#xff1a; 3. BN的优…

QT学习day5

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),socket(new QTcpSocket(this)) {ui->setupUi(this);//初始化界面ui->msgEdit->setEnabled(false);//不可用ui->sendBtn-&g…

软考121-上午题-【软件工程】-敏捷方法

一、敏捷方法 敏捷开发的总体目标是通过“尽可能早地、持续地对有价值的软件的交付”使客户满意。通过在软件开发过程中加入灵活性&#xff0c;敏捷方法使用户能够在开发周期的后期增加或改变需求。 敏捷过程的典型方法有很多&#xff0c;每一种方法基于一套原则&#xff0c;这…

初始C++之缺省参数 函数重载 引用

初始C之缺省参数 函数重载 引用& 文章目录 初始C之缺省参数 函数重载 引用&一、缺省参数1.1 缺省参数的定义1.2 缺省参数的分类1.3 注意事项 二、 函数重载2.1 函数重载的定义2.2 参数个数不同2.3 参数类型不同2.4 类型顺序不同2.5 为什么C语言不支持函数重载 三、引用…

百度Create AI开发者大会剧透丨用好三大AI神器 ,人人都是开发者

程序员会消失&#xff0c;真的吗&#xff1f;大模型的下一站是什么&#xff1f;开发者的机会在哪里&#xff1f;什么才是最好用的AI应用开发工具&#xff1f;在4月16日举办的2024百度Create AI开发者大会上&#xff0c;百度创始人、董事长兼首席执行官李彦宏将就这些备受瞩目的…

蓝桥杯第十三届电子类单片机组决赛程序设计

前言 一、决赛题目 1.比赛题目 2.题目解读 二、功能实现 1.关于定时器资源 1&#xff09;超声波和NE555需要的定时器资源 2&#xff09;定时器2 2.单位切换 3.数据长度不足时&#xff0c;高位熄灭 4.AD/DA多通道的处理 5.PWM输出 6.长按功能的实现 三、完整代码演…