二分精讲版

文章介绍了二分算法的两种主要形式:整数二分和浮点型二分。在整数二分中,重点讨论了边界处理,提供了两种不同的区间划分方式,并强调了`check`函数的作用。而在浮点型二分中,由于精度问题,引入了`eps`作为判断阈值。通过示例代码,帮助初学者理解这两种二分算法的实现细节。
摘要由CSDN通过智能技术生成

二分算法

关于二分算法我总结出了两种,第一种就是整数二分;第二种就是浮点型二分。
首先先讲解一下整数二分,关于整数二分初学者可能学习来有点费劲,因为整数二分需要考虑边界情况,先上代码:

bool check(int x) {/* ... */} // 检查x是否满足某种性质

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(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]时使用:
int bsearch_2(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函数就是用来判断条件的,简单来说就是当核心代码段出现了l =mid 的时候,前面的int mid = l+r就得加1,否则不用加1,这确实会令初学者头疼,日积月累,便能够熟能生巧。
接下来我要讲解浮点型的二分,有关于浮点型的二分,肥肠煎蛋,没有一点坑,接下来上模板:

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;
}

power!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值