二分查找学习笔记

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) --- [二分查找算法(非递归)]

学习数据结构笔记 ---查找算法(线性查找,二分查找,插值查找,斐波那契查找)

JAVA学习笔记----二分查找递归

复盘笔记二分查找和大O表示法

LC T668笔记 & 有关二分查找第K小数BFPRT算法

学习笔记:二分法查找的递归和非递归两种算法