zoukankan      html  css  js  c++  java
  • 二分查找

    二分查找

    整数二分

    1、用途

    快速查询目标值

    2、原理

    对于有序序列(a[l:r]),每次选取区间中点与目标值比较,若相等则返回目标值,不等则缩小搜索区间。

    3、复杂度

    (O(logn))

    4、模板

    //精确查找
    function <int(int)> check = [&](int mid) {};
    int l, r, ans = -1;
    while (l <= r)
    {
        int mid = l + r >> 1, t = check(mid);
        if (!t)
        {
            ans = mid; break;
        }
        else
        {
            if (t > 0) r = mid - 1;
            else l = mid + 1;
        }
    }
    //满足某条件的最大值
    function <bool(int)> check = [&](int mid) {};
    int l, r, ans = l;
    while (l <= r)
    {
        int mid = l + r >> 1;
        if (check(mid)) ans = mid, l = mid + 1;
        else r = mid - 1;
    }
    //满足某条件的最小值
    function <bool(int)> check = [&](int mid) {};
    int l, r, ans = l;
    while (l <= r)
    {
        int mid = l + r >> 1;
        if (check(mid)) ans = mid, r = mid - 1;
        else l = mid + 1;
    }
    

    5、备注

    ①边界情况非常多,建议背模板。

    ②往往用于最大值最小/最小值最大类问题上

    浮点二分

    1、用途

    快速查询目标值

    2、原理

    对于区间([l,r]),每次选取区间中点与目标值比较,若相等则返回目标值,不等则缩小搜索区间。

    3、复杂度

    (O(logn))

    4、模板

    //满足某条件的最大值
    const double eps = 1e-8;
    function <bool(double)> check = [&](double mid) {};
    double l, r, ans = l;
    while (r - l > eps)
    {
        double mid = l + (r - l) / 2;
        if (check(mid)) ans = mid, l = mid;
        else r = mid;
    }
    //满足某条件的最小值
    const double eps = 1e-8;
    function <bool(double)> check = [&](double mid) {};
    double l, r, ans = l;
    while (r - l > eps)
    {
        double mid = l + (r - l) / 2;
        if (check(mid)) ans = mid, r = mid;
        else l = mid;
    }
    

    例题

    暂空

  • 相关阅读:
    ABP框架
    ABP框架
    VS2017调试器无法附加到IIS进程(w3wp.exe)
    c# 动态实例化一个泛型类
    在CentOS7.1上安装Gitlab碰到的问题及解决方法
    MongoDB
    在ABP模板工程中使用MySql
    增加VirtualBox虚拟机的磁盘空间大小(Host:Win7 VirtualBox5.0.16 VM:Win10)
    Spring中Bean及@Bean的理解
    @Bean 的用法
  • 原文地址:https://www.cnblogs.com/Lecxcy/p/13560725.html
Copyright © 2011-2022 走看看