【算法基础】整数二分查找法

news2024/11/18 14:38:28

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前是C语言学习者
✈️专栏:【C/C++】算法
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 一、思想
  • 二、运用场景
  • 三、分析
      • 情况1:mid = (l + r + 1) / 2
      • 情况2:mid = (l + r ) / 2
  • 四、代码模板及使用条件
      • 模板1
      • 模板2
      • 使用条件
  • 五、边界问题分析
  • 六、例题
      • 1、例题描述
      • 2、思路
      • 3、代码实现

一、思想

<图片来源于百度>
在这里插入图片描述

如上动图所示,若在一个有序的数组中查找一个数,binary_search(二分查找)需要查找三次,而sequential_search(顺序查找)则需要11次。
由此二分的优点是查找次数少,查找速度快,平均性能好并且其时间复杂度O(log(n))

二、运用场景

在一个数组内,若要查找一个数字,要求找到这个元素的下标(开始位置或者结束位置),并且这个数组范围内的元素都具有单调性,因此可以用二分查找法来做。

三、分析

l - 左边界
r - 右边界
n - 元素个数
val - 查找元素
a[] - 原数组

情况1:mid = (l + r + 1) / 2

在这里插入图片描述

  • 二分范围:l = 0r = n - 1,首先二分查找≤val的最右边界
  • a[mid] >= val时,说明第一个>=val元素的位置一定在mid处或mid的右侧,即答案的范围:[mid,r],将l更新为mid
  • 否则当a[mid] < val时,说明val在mid的左侧(不包括mid),即答案范围:[l,mid - 1],将r更新为mid - 1
  • 如果a[l]!=val说明没有找到该值,否则就找到了。

情况2:mid = (l + r ) / 2

在这里插入图片描述

  • 二分范围:l = 0r = n - 1,首先二分查找≥val的最左边界
  • a[mid] >= val时,说明第一个>=val元素的位置一定在mid处或mid的左侧,即答案的范围:[l,mid],将r更新为mid
  • 否则当a[mid] < val时,说明val在mid的右侧(不包括mid),即答案范围:[mid+1,r],将l更新为mid + 1
  • 如果a[l]!=val说明没有找到该值,否则就找到了。

四、代码模板及使用条件

模板1

当我们将区间[l,r]划分成[l,mid][mid + 1,r]时,其更新操作是r = mid或者l = mid + 1,计算mid时不需要+1,即mid = (l + r)/2

int binary_search1(int l, int r)
{
	while (l < r)
	{
		int mid = (l + r) / 2;
		if (check(mid)) //检查mid是否满足某种性质
		{
			r = mid;
		}
		else
		{
			l = mid + 1;
		}
	}
	return l;
	//由于当 l=r 时 ,while 循环停止,
    //因此最后的返回值既可以是 l 也可以是 r
}

模板2

当我们将区间[l,r]划分成[l,mid - 1] 和[mid,r]时,其更新操作是 r = mid - 1或者 l = mid,此时为了防止死循环,计算mid时需要 + 1(这属于边界问题,后面有介绍),即mid = (l + r + 1) / 2

int binary_search2(int l, int r)
{
	while (l < r)
	{
		int mid = (l + r + 1)/ 2;
		if (check(mid))//检查mid是否满足某种性质
		{
			l = mid;
		}
		else
		{
			r = mid - 1;
		}
	}
	return l;
	//由于当 l=r 时 ,while 循环停止,
    //因此最后的返回值既可以是 l 也可以是 r
}

使用条件

假设初始时二分区间为[l,r],每次二分都会缩小范围,当你发现左边界l要更新为mid时,此时就要用模板2;如果左边界I更新为mid + 1,此时就使用模板1,所以模板的使用条件是根据代码而使用的。

五、边界问题分析

假设模板2中的mid没有+1,此时mid = (l + r) / 2,就会发生边界问题。例如当 l 和 r 相差1的时候,l + 1 = r 时,带入得,mid = (2l + 1) / 2,下取整,mid = l。左边界再次更新为l = mid = l,l更新还是l,就会发生死循环。

六、例题

<牛客网例题,点击跳转>

1、例题描述

在这里插入图片描述

2、思路

在这里插入图片描述

用二分查找第一个 >= val 的位置,查找成功则返回下标,否则返回 -1

3、代码实现

在这里插入图片描述

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

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

相关文章

[golang Web开发] 1.golang web开发简介以及web服务器的搭建以及http协议简介

一.web开发简介 1.简介 Web应用在我们的生活中无处不在,看看我们日常使用的各个应用程序,它们要么是 Web应用&#xff0c;要么是移动 App 这类 web应用的变种,无论哪一种编程语言&#xff0c;只要它能够开发出与人类交互的软件&#xff0c;它就必然会支持 Web应用开发,对一门崭…

高精度压缩Transformer,NNI剪枝一站式指南

无论在学术界还是产业界&#xff0c;今年人工智能大模型都是爆款话题。但面对这些动不动就数十亿级别参数的模型&#xff0c;使用传统方法微调&#xff0c;宛如水中捞月、海底捞针。作为微软亚洲研究院为科研人员和算法工程师量身定制的一站式 AutoML&#xff08;自动机器学习&…

Vertical-align属性值区分

先简单看一下官方文档上的Vertical-align这些属性值的描述&#xff0c;虽然只有简单的描述&#xff0c;但其实描述的很清楚&#xff0c;但有时只看文字并不能很好的理解其含义。 下面结合代码图说明&#xff1a; 首先&#xff0c;我建造了一个背景颜色为绿色的div盒子&#xf…

9、app稳定性测试之monkey工具使用

简介 方法:利用Monkey工具,选择某些场景做持续反复操作,以衡量系统的稳定性 工具: monkey 友盟埋点 日志分析工具 系统监控工具GT 场景: * 随机测试 可以用monkey模拟 * 多个运行中app切换测试&#xff1b; * 各种事件打扰&#xff0c;如插拔数据线、电话打扰、收…

软件测试之冒烟测试须知

冒烟测试的介入时间? 开发编码完成&#xff0c;自测通过以后为最佳介入时间。 如果开发无自测直接提交&#xff0c;一般冒烟测试通过率会很低【除非你遇到的是大内高手】 什么需求需要做冒烟测试? 理论上&#xff0c;所有的需求均可以做冒烟测试。 冒烟测试需要做几轮? 一轮…

分享会上狂吹MySQL的4大索引结构,没想到大家的鉴赏能力如此的~~~~

索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足 特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c; 这样就可以在这些数据结构 上实现高…

企业需要做哪些准备,来落地商业智能 BI 系统

随着新一代信息化、数字化技术的应用&#xff0c;引发了新一轮的科技革命&#xff0c;现代化社会和数字化的联系越来越紧密&#xff0c;数据也变成继土地、劳动力、资本、技术之后的第五大生产要素&#xff0c;这一切都表明世界已经找准未来方向&#xff0c;前沿科技也与落地并…

中国电子学会2022年09月份青少年软件编程Scratch图形化等级考试试卷四级真题(含答案)

2022-09 Scratch四级真题 分数&#xff1a;100 题数&#xff1a;29 测试时长&#xff1a;60min 一、单选题(共15题&#xff0c;共30分) 1.运行下列程序&#xff0c;说法正确的是&#xff1f;&#xff08;D&#xff09; A.列表中的数字全部小于11 B.列表的长度为10 C.变量…

项目管理:甘特图的作用是什么?

在我们工作和学习中&#xff0c;有一个提高工作效率&#xff0c;简单又实用的神器——甘特图。 甘特图以表格进度条&#xff0c;展示任务列表和时间表示出项目的持续时间及进度。并根据实际执行时间和工期对计划进行动态调整的进度控制方法。 甘特图将各个任务的完成情况在时间…

论Unity_InputSystem如何使用(三)

PlayerInput InputSystem提供专门用来处理玩家输入的组件&#xff0c;通过关联配置输入文件&#xff0c;可以不需要编写设备输入的相关逻辑&#xff0c;专注于编写输入触发后的逻辑。 如何添加 创建一个Cube&#xff0c;点击Add Component&#xff0c;搜索Player Input即可添…

【C语言 数据机构】时间复杂度与空间复杂度

文章目录时间复杂度空间复杂度时间复杂度 判断一个算法所编程序运行时间的多少&#xff0c;并不是将程序编写出来&#xff0c;通过在计算机上运行所消耗的时间来度量。原因很简单&#xff0c;一方面&#xff0c;解决一个问题的算法可能有很多种&#xff0c;一一实现的工作量无疑…

cocoapods安装失败到成功的记录贴

mac系统版本&#xff1a;10.15.5 (19F101) 最优解安装顺序&#xff1a;Xcode > HomeBrew > RVM > Ruby > CocoaPods 1. 安装方案1(百度常用法&#xff09; 1.1 更新gems和换国产源&#xff1a; RubyGems 镜像 - Ruby Chinahttps://gems.ruby-china.co…

使用VBA获取电脑MAC地址

实例需求&#xff1a;如何使用VBA读取电脑的MAC地址&#xff0c;包含有线网卡和无线网卡。 这个需求看似有些无厘头&#xff0c;为嘛要用VBA来读取MAC地址&#xff0c;存在的就是合理的。例如使用MAC地址和其他硬件信息可以生成电脑的唯一识别号&#xff0c;用于软件注册和实现…

Vue Node

Vue配置代理服务器 一、运行后台服务 启动后台Node服务器&#xff0c;运行后台程序&#xff0c;学习资料node代码&#xff0c;服务5000开启 FeHelper - Awesome 二、Ajax请求 xhr 【不常用】Windows 内部 new XMLHttpRequest()xhr.open() xhr.send()内部公司封装xhr开源封装…

力扣 2325. 解密消息

题目 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 将替换表与普通英文字母表对齐&#xff0c;形成对照表。 按照对照表 替换…

OAuth2 01

目录 1.什么是OAuth 2.OAuth2中的角色 3.认证流程 4.生活中的OAuth2思维 5.令牌的特点 6.OAuth2的授权方式 6.1 OAuth2授权码 6.2 隐藏方式 6.3 密码方式 6.4 凭证方式 1.什么是OAuth2 1.OAuth2.0介绍 OAuth&#xff08;Open Authorization&#xff09;是一个关于授权&…

Android 抓包相关 SSL相关

https无法明文抓包 Android P版本开始强制App使用Https协议&#xff0c;否则访问崩溃如下所示错误&#xff1a; java.lang.ClassCastException: com.android.okhttp.internal.huc.HttpURLConnectionImpl cannot be cast to javax.net.ssl.HttpsURLConnection可参阅&#xff…

C 语言零基础入门教程(二十三)

C 可变参数 有时&#xff0c;您可能会碰到这样的情况&#xff0c;您希望函数带有可变数量的参数&#xff0c;而不是预定义数量的参数。C 语言为这种情况提供了一个解决方案&#xff0c;它允许您定义一个函数&#xff0c;能根据具体的需求接受可变数量的参数。下面的实例演示了…

Centos8中安装配置php

一、问题描述Centos8中我们在使用Apache部署配置网站的时候&#xff0c;发现Apache服务已经正常启动且网站也配置完成到Apache主目录中&#xff0c;但是访问时网站却不能正常运行【即&#xff1a;只能够以列表的方式列出所有网站的资源文件&#xff0c;而不是以网页的形式展现】…

关于荧光素76863-28-0,FITC-5-thiosemicarbazide,荧光素-5-氨基硫脲 相关知识分享

荧光素-5-氨基硫脲&#xff0c;Fluorescein-5-thiosemicarbazide&#xff0c;FITC-5-thiosemicarbazide荧光素-5-氨基硫脲是一种含胺的荧光探针&#xff0c;可用于标记糖和蛋白质羰基衍生物Product specifications&#xff1a;1.CAS No&#xff1a;76863-28-02.Molecular formu…