二分查找学习笔记
Posted 白发童子自来也
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找学习笔记相关的知识,希望对你有一定的参考价值。
点击阅读原文
或将以下链接
https://blog.summerfire.cn/index.php/2020/12/30/%e4%ba%8c%e5%88%86%e6%9f%a5%e6%89%be%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0/
复制到浏览器访问我的博客阅读
二分查找模板
整数二分
/*整数二分分为两个模板,选用思路如下:
首先,先写出mid=(l+r)/2,后面再判断是否加1。
然后,根据题目性质,来看选择哪个。不妨假设待查找区间分成两半,右边是满足该条件的区间,左边是不满足该条件的区间(相对而言)。如果需要的是满足某条件的第一个点,那么则为r=mid。如果需要的是满足某条件的最后一个点,则为l=mid。具体区间的划分方法取决于check函数的写法。
*/
bool check(int x) //检查mid是够满足某性质
int binary_search_1(int l, int r)
{
while(l < r)
{
int mid = (l + r) / 2;
if(check(mid)) r = mid;
else l = mid + 1;
}
//返回l或者r都可以,最终两者是相等的
return l;
}
bool check(int x) //检查mid是够满足某性质
int binary_search_2(int l, int r)
{
while(l < r)
{
int mid = (l+r+1)/2;
if(check(mid)) l = mid;
else r = mid - 1;
}
//返回l或者r都可以,最终两者是相等的
return l;
}
浮点数二分
❝由于浮点数除法没有向下取整,所以只有一个模板,mid都为(l+r)/2。故边界更新方式也只有一种,l或者r等于mid即可。但还是应该注意根据check函数的写法,来决定边界的更新方式。
❞
bool check(double x) {/* ... */} // 检查x是否满足某种性质
double bsearch_3(double l, double r)
{
const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}
以上是关于二分查找学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
学习数据结构笔记(15) --- [二分查找算法(非递归)]