二分查找【图文详解】

二分法查找数字--算法分析和源码 采用二分法查找数字是用的比较多的一种方法 其算法思想可以这样理解: 比如有 阅读详情

在这里插入图片描述

简介

  1. 二分法的思想十分容易理解,但是二分法边界处理问题大多数人都是记忆模板,忘记模板后处理边界就一团乱(👁:“我懂了”, ✋ :"你懂个🔨"​)因为我此前也是记忆模板,所以现在想通过一边学习,一边将所学记录成博客教出去(费曼学习法),希望以后能自己推导出边界如何处理,而不仅仅是记忆模板。
  2. 故事分享🏬:

有一天小明到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把小明拦下,要检查一下哪本书没有登记出借。小明正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是再把这堆书分成两堆…… 最终,检测了 logN 次之后,保安成功的找到了那本引起警报的书,露出了得意和嘲讽的笑容。于是小明背着剩下的书走了。 从此,图书馆丢了 N - 1 本书。

保安怎么知道只有一本书📖没有登记出借,万一全部都没有登记呢​?
这个故事其实说出了二分查找需要的条件

  • 用于查找的内容逻辑上来说是需要有序的
  • 查找的数量只能是一个,而不是多个

比如在一个有序的数组并且无重复元素的数组中,例如[1, 2, 3, 4, 5, 6],需要查找3的位置就可以使用二分查找。

因为查找的区间是不断迭代的,所以确定查找的范围十分重要,主要就是左右区间的开和闭的问题,开闭不一样,对应的迭代方式也不一样,有以下两种方式:

  • 左闭右闭 [left, right]
  • 左闭右开 [left, right)

算法分析

1. 题目

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

  • 示例1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

  • 示例2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

2. 分析
二分法的思想很简单,因为整个数组是有序的,数组默认是递增的。

  • 首先选择数组中间的数字和需要查找的目标值比较
  • 如果相等最好,就可以直接返回答案
  • 如果不相等
    • 如果中间的数字大于目标值,则中间数字向右的所有数字都大于目标值,全部排除
    • 如果中间的数字小于目标值,则中间数字向左的所有数字都小于目标值,全部排除

二分法就是按照这种方式进行快速排除查找的

1.当数组长度为奇数:
在这里插入图片描述

  • 是奇数的情况很简单,指向中间的数字很容易理解,如果需要查找的数字为29
  • 因为29大于中间的数字大于11,所以左边的所有数字全部排除

在这里插入图片描述

2. 当数组长度为偶数:
在这里插入图片描述
这个时候中间的数字两边的数字数量就不一样了(刚开始学习二分法的时候我经常纠结这个问题,和另外一个长度除2得到的是最中间的数吗的问题,我相信不止我一个人纠结过……但其实这是同一个问题,每次长度除2,如果长度为奇数,得到的中间的数字两边数字数量相同,如果长度为偶数就为上图中间的数字两边的相差为 1)

但是千万不要一直纠结中间的数字两边的数字数量不一样这个问题,因为:

  • 两边数量不一样是一定会出现的情况
  • 但是这种情况并不影响我们对中间数字和目标数字大小关系的判断
    • 只要中间数字大于目标数字,就排除右边的
    • 只要中间数字小于目标数字,就排除左边的

题解及复杂度分析

package org.algorithm;

/**
 * TODO
 *  * @author Leonard
 * @version 1.0
 * @date 2022/1/25 0025 15:40
 * @des  【二分查找法】
 *  * 给定一个n个元素有序的(升序)整型数组nums 和一个目标值target ,
 * 写一个函数搜索nums中的 target,如果目标值存在返回下标,否则返回 -1
 *  */
public class AlgoDemo1 {

    public static int search(int[] nums, int target){
        int low = 0, high = nums.length-1;
        while (low<=high){
            int mid = (high-low)/2 + low;
            int num = nums[mid];
            if (num==target){
                return mid;
            }else if(num > target){
                high = mid-1;
            }else {
                low = mid+1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        int[] nums = {-1,0,3,5,9,12};
        int target = 9;

        search(nums,target);
    }
}
  • 复杂度分析
    • 时间复杂度:O(\log n)O(logn),其中 nn 是数组的长度。
    • 空间复杂度:O(1)O(1)。

总结

二分法最重要的两个点,就是循环条件和后续的区间赋值问题
在这里插入图片描述
因为两者是相互联系,相互影响的,所以就需要两者统一,如果两者不统一,就会出现问题

所以循环条件和赋值问题必须统一,也就是循环不变量。

【C语言二分查找法详解】(含图文) 这里我们就要输入一个数字来与我们中间的元素进行比较了,这里我们假设输入的数字input为7,而7>5(中间元素),所以目前mid下标极其它左边所有下标代表的元素就肯定不会是7了,所以我们就要重新划分范围了,原来mid本身所代表的元素及其左边的所有元素全部舍去,舍去之后我们现在最左边的元素就是mid+1了(left=mid+1),而我们最右边的下标right继续保持不变,上面我们只是考虑了找到的情况,而没有找到的情况还没写,所以我们代码还没写完,这里我们思考一下没有找到的条件是什么?(举个生活中的例子:比。 阅读详情

相关推荐

CLIP-Count代码配置以及踩坑记录

CLIP-Count代码配置以及踩坑记录

学术菜鸡 1011

二分查找--图文详解

二分查找也称折半查找,是在一组有序(升序/降序)的数据中查找一个元素,它是一种效率较高的查找方法。

iLoyo_的博客 3万+

从零搭建医疗化验单识别系统:深度学习+OCR实战教程(附数据集)

本文详细介绍了如何从零开始构建一个医疗化验单智能识别系统。通过融合深度学习和OCR技术,系统能够应对版式多样、内容专业的医疗单据,实现从文本检测、识别到关键信息结构化抽取的全流程。文章提供了数据集处理、模型选型、训练微调及工程化部署的实战指南,并分享了避坑经验与性能优化策略,为开发者解决医疗信息化痛点提供了完整的技术方案。

k9l0m1的博客 493

【C语言】二分查找(含图解)

注:使用递归查找,值得注意的是,每次递归时,需要缩小查找的范围,也就是每次传入的左右边界发生了改变,因此入参必有。第四轮查找:搜索区域内中间元素的位置是 [(7+7)/2]=7,因此中间元素是 33,此元素就是要找的目标元素。第一轮查找:根据 27

将冲破艾迪i的博客 4万+

PX4笔记系列(二)vtol_att_control中的tiltrotor解析

update_vtol_state() 注释:采用两段切换的简单逻辑来进行过渡 当切换过渡开关后,飞机将会开始倾转动力,逐渐加速,当飞机获得足够速度后动力将会完全打到向前的位置。对于过渡返回阶段动力则是简单地倾转回来。 如果(不在向前过渡指令下): 当前vtol飞行模式: 1、旋翼模式 无操作 2、固定翼模式 令vtol飞行模式切换到过渡返回模式 3、P1过渡模式 进入过渡失败安全返回至旋翼模式 4、P2过渡模式 进入过渡失败安全返回至旋翼模式 5、过渡返回模式 记录过渡返回时间=当前时间-过渡开始

hypersonicss的博客 1881

十.镜头知识之畸变问题

对于理想光学系统,在一对共轭的物像平面上,像的放大率是一个常数。但是对于实际的光学系统,当视场较大或很大时,像的放大率就要随视场而异,这样就会使像相对于物体失去相似性。这种使像变形的成像缺陷称为畸变。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2127

二分查找算法学习总结

要求: 能够用自己语言描述二分查找算法 能够手写二分查找代码 能够解答一些变化后的考法

一切总会归于平淡 2008

YOLO11涨点优化:损失函数优化 | 引入MPDIoU,利用边界框左上角和右下角距离,彻底解决重叠框匹配失效问题

【摘要】针对目标检测中重叠框匹配失效问题,本文提出基于MPDIoU损失函数的解决方案。MPDIoU通过同时约束边界框的左上角和右下角两点距离,有效解决了传统IoU损失在重叠场景下的优化歧义问题。文章首先分析YOLO系列在密集目标检测中的性能瓶颈,指出GIoU/CIoU等现有方法无法区分相同IoU值但偏移方向不同的预测框。随后详细解析MPDIoU的数学原理及其相对于主流损失函数的优势,证明两点距离约束能提供唯一优化方向。最后给出在YOLO11中实现MPDIoU的具体方案,包括核心代码修改点和架构适配建议。实验

2601_95807009的博客 173

算法与数据结构面试宝典——二分查找算法详解

二分查找 binary search」是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮减少一半搜索范围,直至找到目标元素或搜索区间为空为止。!!!question给定一个长度为n的数组nums,元素按从小到大的顺序排列,数组不包含重复元素。请查找并返回元素target在该数组中的索引。若数组不包含该元素,则返回−1。如下图所示,我们先初始化指针i0和jn−1,分别指向数组首元素和尾元素,代表搜索区间0n−1。请注意,中括号表示闭区间,其包含边界值本身。

白话机器学习 450

YOLOv11改进 | 网络结构代码逐行解析(二) | yolov11中的Mosaic增强详解

本文给大家带来的是YOLOv10中的Mosaic增强代码的详解,可能有部分人对于这一部分比较陌生,有的读者可能知道Mosaic增强但是不知道其工作原理,具体来说Mosaic增强就是指我们的数据集中的图片在输入给模型之前的一个处理过程(我们的图片并不是直接就输入给模型了,大家的训练结果中的结果检测图片大家可以看到数据集中多个图片会组合在一起这就是简单的Mosaic增强),下面我就来讲解一下其在YOLOv10中工作原理和代码定义,下面图片为一个Mosaic增强后的图片。​。

Snu77的博客 5024

高云FPGA系列教程(7):ARM GPIO外部中断

高云GN1NSR-4C共有16个GPIO,每个GPIO可配置成输入或输出模式,支持中断输入,触发方式可选择:上升沿、下降沿、高电平、低电平触发。中断优先级可通过NVIC进行设置,支持 0-7 级可编程中断优先级。

whik1194的博客 1376

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

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

不头冷,无程序 1595

华为OD机试 - 最快到达医院的方法(Python/JS/C/C++ 2024 E卷 100分)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 2172

二分查找——图文详解(加代码)

二分查找也叫折半查找,是在一组有序(升序/降序)的数据中查找一个元素,它是一种效率较高的查找方法。

weixin_58474273的博客 1163

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【图文详解】二分查找过程描述和代码实现、二分查找插入点

本章详细介绍:二分查找过程描述和代码实现、二分查找插入点

独立思考,明辨是非 573

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【算法模块】二分查找----图文详解(含代码)

为例:我们要想找到左端点的8的下标,我们就要以划分成两个部分:【5,7,7】和【8,8,10】,第一部分都是小于目标值8的,第二部分都是大于等于目标值的;为例:我们要想找到右端点的8的下标,我们就要以划分成两个部分:【5,7,7,8,8】和【10】,第一部分都是小于等于目标值8的,第二部分都是大于目标值的;按照上面的查找方法,我们不一定非要取中间值,我们可以取1/3区间处的点,也可以取1/4,1/5,1/6......等任意区间,只不过在取中间位置的时候,效率会更快。两种表示方法都可以;

weixin_74116463的博客 1675

剑指Offer #06 旋转数组的最小数字(二分查找)| 图文详解

题目来源:牛客网-剑指Offer专题 题目地址:旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 题目解析 方法一: 最直观的方法莫过于...

Veggie的博客 1万+

【C/C++算法】从浅到深学习--- 二分查找(图文兼备 + 源码详解)

本章是算法篇章的第三章二分算法,本章主要是通过题目的形式来进行学习,通过八道题让你基本了解二分法算法以及它的许多细节,在简介部分将会一定性的总结二分算法编写时的细节,通过这些了解这些细节,然后再通过前两道题了解二分算法的常见三种模板,再通过6道题巩固相信你对二分算法就会有很大的提升,后面将持续更新前缀和算法,敬请期待~

溟洵的博客 1628

二分查找算法&最靠左索引&最靠右索引详解与优化:图文全解+代码详注+思路分析

java实现二分查找,二分查找算法实现思路,二分查找算法时间复杂度与空间复杂度,二分查找平衡版,Java源码中二分查找的使用,实现二分查找目标值,不存在则插入Rightmost,Leftmost,最靠左索引,最靠右索引,返回≥目标的最靠左索引,搜索大于等于目标值的最小索引位置 ,返回≤目标的最靠右索引,搜索小于等于目标值的最大索引位置,范围查询,求排名,求前任,求后任,求最近邻居

是谢添啊 3410

卧槽!LeetCode 电子书终于开放下载了,覆盖字节、蚂蚁、腾讯多家大厂真题(附5000页大厂试题)...

最近有有不少老铁在后台留言说,想进大厂,但是算法不好。最近我整理了一份刷题实录,这份刷题实录,也让我进了心仪的大厂。现在开放分享给大家。希望对大家有所帮助。任何的算法题,如同写作文一样,...

欢迎关注公众号:【码农突围】,回复9999,可以获取一份LeetCode刷题笔记 507

二分查找(图文并茂)

摘要:本文介绍了二分查找的实现方法。首先通过示例演示了二分查找过程:在有序数组中查找目标值2的下标,详细说明了左右边界和中间值的计算过程。接着提供了两种代码实现:数组版使用循环和条件判断实现二分查找;STL版利用lower_bound函数快速定位元素。两种方法都包含查找失败时的处理逻辑,完整展示了二分查找从原理到实践的实现过程。

初心如磐,逐梦前行||b站@一个空客迷 358

《全网最易懂 | 图文一步步带你搞懂二分查找》

但在查找的过程中left、right、middle会一直变化的,也即可能在数组middle分割点的左侧区间去寻找,也可能在数组middle分割点右侧寻找。求一个数num的平方根,我们可以想象下,如果num是0或者1,那么它的平方根还是它自己,否则一个非负整数的平方根,肯定是在(0, num)之间的。二分查找的前提是数组必须有序,无论是升序还是降序(同时数组中无重复的元素),因为它核心的思想就是经过一次判断,就需要把搜索的区间缩小一半,直到搜索的范围左右边界的差值为0,也即找到指定的元素为止。

边城梦溪 256

Java二分查找-图文

Java二分查找-图文

分享我的点点滴滴,在成长路上与你同行! 1639

c语言实现二分查找图示详解

那么这里给出的数组一共是10个元素,而我们知道数组的下标是从0开始的,left指向的下标是0,right指向的下标是9,那这里算出的结果为什么不是4.5呢,因为在c语言里,“/”这个符号算出来的结果只取商的部分,余数部分会被舍去,所以这里的mid是4。第一步:我们先看一下mid指向的元素是不是15,很明显,此时mid指向的数字是14,14比15小,所以mid👈左边的那些数字我们都可以排除了,因为它们都比15小,我们就可以一下排除掉一半的数,只在mid右边的那些数里面找就行了。

2402_83672777的博客 1266

查找算法之二分查找算法

图文并茂带你入门二分查找算法 原理 二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,有点类似分治的思想。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。 为了方便理解,我们以数组1, 2, 4, 5, 6, 7, 9, 12, 15, 19, 23, 26, 29, 34, 39,在数组中查找26为例,制作了一张查找过程图,其中low标示左下标,high标示右下标,mid标示

qq_47897078的博客 2万+

【二分查找】(折半查找)(图文版)

查找过程、代码实现

志之所趋,无远弗届,穷山距海,不能限也 1685
上一篇: 2021-07-09 Demo 输入一个数字顺时针打印出矩阵
下一篇: Idea自动清除无效的import导入包
一朝游
博客等级 码龄8年 0粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值