【算法基础】整数二分查找法
创始人
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、代码实现

在这里插入图片描述

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...