二分查找 【模板+中间值问题】
创始人
2024-01-20 12:45:55

全文目录

  • 😃前言
  • 😕二分查找动图演示
  • 😴代码模板
  • ❗️ 使用哪个模板问题 ❗️
  • 💢 mid为何+1问题 💢

😃前言

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。它要求元素具有有序性,或者具有跟有序性类似的性质,能够不断地缩小查找范围。

查找操作主要有一下几点:

1、确定需要查找的值,设立基准值(一般是中间值),设立判断条件,判断基准值是否满足某种性质

2、以基准值为边界,划分左右两个区间

3、根据判断条件是否成立,分析结果可能存在的区间,更新查找范围

4、重复以上操作,直到区间不存在(左边界大于右边界)或查找到需要的值时,查找结束


😕二分查找动图演示

在这里插入图片描述


😴代码模板

我们这里以整数的有序序列为例,演示二分查找的代码和需要注意的事项。整数二分的代码分为两种情况:

  1. 判断条件成立时新区间需要更新在左半区间,即[l, mid]
  1. 判断条件成立时新区间需要更新在右半区间,即[mid, r]

需要注意的是不管哪种情况,条件成立都需要将取到mid,因为mid可能为答案

bool check(int x) {/* ... */} // 检查答案是否满足某种性质// 查找左区间
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:条件成立,新区间在[l, mid]
int SearchLeft(int l, int r)
{while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;    // check()判断mid是否满足性质else l = mid + 1;}return l;
}// 查找右区间
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:条件成立,新区间在[mid, r]
int SearchRight(int l, int r)
{while (l < r){int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}return l;
}

❗️ 使用哪个模板问题 ❗️

决定使用哪个模板,是根据check(mid)来决定的:

check(mid)就是判断答案在左半区间还是右半区间

1、如果check(mid)是判断答案在左半区间,使用SearchLeft模板(mid不需要+1):

如果在条件成立,说明答案在左半区间,也就是[l, mid],新区间为[l, mid],区间更新方式为r = mid
如果条件不成立,说明答案在右半区间,也就是[mid + 1, r],新区间为[mid + 1, r],区间更新方式为l = mid + 1

2、如果check(mid)是判断答案在右半区间,使用第二个模板(mid需要+1):

如果在条件成立,说明答案在右半区间,也就是[mid, r],新区间为[mid, r],更新条件为l = mid
如果条件不成立,说明答案在左半区间,也就是[l, mid - 1],新区间为[l, mid - 1],更新条件为r = mid - 1


💢 mid为何+1问题 💢

在这两种情况中,区间划分好理解,不就是一左一右、一加一减嘛。但是在mid为何需要加1可能会让很多人疑惑,我在学习的时候也是迷糊了好久。现在将从大佬那里总结到的经验分享一下:

1、在SearchLeftmid 为何不需要 +1

设左右两个边界只相差1,即l = r - 1时,如果 mid + 1mid 向下取整 ,即mid == r ,如果条件刚好成立的话,就会导致更新完区间后r还是等于mid,等于没有更新,这时候就是一个死循环了。所以mid 不需要 +1,进行向上取整,让mid == l,破坏死循环的条件。

2、在SearchRightmid为何需要 +1

设左右两个边界只相差1,即l = r - 1时,当mid不 +1 时mid是向上取整的,所以mid == l,如果条件刚好成立的话,就会导致更新完 区间后l还是等于mid,等于没有更新,这时候就是一个死循环了。所以需要mid+1进行向下取整,让mid == r,破坏死循环的条件。

大佬原话:

对于mid + 1与否我觉得是为了让区间平分
mid = left + right >> 1; 这里mid是上中位数
mid = left + right + 1 >> 1; 这里mid是下中位数
如果取left = mid, 即[mid, right], 则mid取下中位数才能平分区间
如果取right = mid, 即[left, mid], 则mid取上中位数才能平分区间


完结散花🌈🌈🌈
在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
阳澄湖在哪里哪个省的 阳澄湖是... 点击题目下方苏州生活指南有用 有趣 有态度近期的阳澄湖度很高,3月24日,央视二套《第一时间》直播连...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
金属硬度排行 各种金属硬度 世界上最硬的东西排名分别为硫化碳块,石墨烯,金刚石,金属玻璃和金属锇。这五种物体几乎是整个世界上最坚...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...