【算法基础】整数二分查找法
创始人
2024-05-22 07:41:22
0

在这里插入图片描述

👦个人主页:@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、代码实现

在这里插入图片描述

相关内容

热门资讯

美丽的神农谷三年级作文(精简... 美丽的神农谷三年级作文 篇一神农谷是我家附近一个非常美丽的地方。每当我有时间,我都会去神农谷散步。神...
我的学校三年级作文(优质6篇... 我的学校三年级作文 篇一我喜爱的学校图书馆我所在的学校有一个很棒的图书馆,它是我最喜欢去的地方之一。...
三年级作文新学期的开始【经典... 三年级作文新学期的开始 篇一新学期的开始新学期开始了,同学们都充满了期待和憧憬。我们迈进了三年级的课...
小学三年级我的老师作文400... 篇一:小学三年级我的老师我非常喜欢我的小学三年级的老师,她是一个非常好的老师。她叫李老师,是一个年轻...
将门虎子三年级作文(精彩3篇... 将门虎子三年级作文 篇一我的宠物小狗我家有一只很可爱的宠物小狗,它的名字叫将门虎子。将门虎子是一只三...
母爱是无私的三年级作文【优秀... 母爱是无私的三年级作文 篇一母爱是无私的母爱是世界上最伟大的力量,它是无私的。无论是在我们出生的那一...
第一次掌勺作文_三年级作文(... 第一次掌勺作文_三年级作文 篇一第一次掌勺今天,我迎来了人生中第一次掌勺的机会。我既兴奋又紧张,因为...
小学三年级作文700字 【精品】小学三年级作文700字3篇  在日常学习、工作抑或是生活中,说到作文,大家肯定都不陌生吧,写...
黄岩石窟三年级作文(实用3篇... 黄岩石窟三年级作文 篇一探秘黄岩石窟我家住在浙江省的黄岩市,最近我们班组织了一次参观黄岩石窟的活动。...
假如我会变三年级450字作文... 假如我会变三年级450字作文 篇一如果我能变成三年级的学生,我会怎么样呢?首先,我会更加努力学习,争...
可恶的小老鼠三年级作文【精简... 可恶的小老鼠三年级作文 篇一最近我们班的教室里出现了一个可恶的小老鼠。这只小老鼠总是在我们不注意的时...
三年级作文200个子18篇【... 篇一:我的暑假计划暑假即将来临,我早早地制定了一个丰富多彩的暑假计划。首先,我计划读很多好书。我喜欢...
小学三年级作文400字【实用... 小学三年级作文400字 篇一爱护小动物我家附近有一个小公园,里面有很多小动物。我喜欢去那里看它们,但...
三年级科幻作文智能干家务的机... 三年级科幻作文智能干家务的机器人 篇一智能家务机器人的出现在未来的世界里,科技发展迅速,人们的生活变...
三年级下册我做了一项小实验作... 三年级下册我做了一项小实验作文 篇一标题:探究种子发芽的条件在三年级下册的科学课上,我们进行了一项小...
三年级学生感受作文(优选6篇... 三年级学生感受作文 篇一我喜欢上学的理由我是一个三年级的学生,我非常喜欢上学。每天早上,当妈妈叫我起...
小学三年级说好普通话作文(优... 小学三年级说好普通话作文 篇一我要当一个好学生我是一个小学三年级的学生,我知道要成为一个好学生,首先...
三年级的黄果树瀑布的作文怎么... 篇一:三年级的黄果树瀑布之旅黄果树瀑布是中国贵州省的一处自然景观,也是我国最大的瀑布之一。作为一个三...
三年级作文抓鱼趣事21篇【最... 三年级作文抓鱼趣事21篇 篇一:我和小伙伴们的抓鱼经历在一个阳光明媚的周末,我和几个小伙伴决定去河边...
三年级作文:踢足球(精简6篇... 三年级作文:踢足球 篇一踢足球是我最喜欢的运动之一。我每天放学后都会和朋友们一起来到学校的操场上踢球...