返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中二分法是什么
  • 434
分享到

C++中二分法是什么

2023-06-29 02:06:12 434人浏览 八月长安
摘要

这篇文章主要介绍了c++中二分法是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、整数二分单调性与二分的关系:有单调性一定可以二分,用二分不一定是单调性。二分的本质不是

这篇文章主要介绍了c++中二分法是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

    一、整数二分

    单调性与二分的关系:有单调性一定可以二分,用二分不一定是单调性。二分的本质不是单调性而是边界点(找符合条件的最小的数或者最大的数)整数二分是求红色范围的右端点 或者 绿色范围的左端点

    C++中二分法是什么

    1.整数二分模板

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

    【模板1】

    1、求红色边界点

    C++中二分法是什么

    注: + 1原因:

    / 是向下取整,当l与r只相差1的时候,即 l = r - 1,最终的结果mid = l(即结果不变还是l),补上1之后 mid = r,再次循环之后l = r 即[r , r],最终结束循环。如果不补1将会出现死循环。

    【模板2】

    求绿色边界点

    C++中二分法是什么

    2.求解二分问题的思路

    每次先划分区间,写一个mid,后面再考虑是否补上加1操作然后想一个check()函数,康康是否满足性质,根据check()函数的值取判断怎么划分(mid在哪一边),到底是是l = mid,还是r = mid,第一种补上1即可。(关键是找性质,判断是否满足性质然后判断mid在左边还是右边)

    3.练习

    (1).数的范围

    给定一个按照升序排列的长度为 nn 的整数数组,以及 qq 个查询。

    对于每个查询,返回一个元素 kk 的起始位置和终止位置(位置从 00 开始计数)。

    如果数组中不存在该元素,则返回 -1 -1

    输入格式

    第一行包含整数 n 和 q,表示数组长度和询问个数。

    第二行包含 nn 个整数(均在 1&sim;10000 范围内),表示完整数组。

    接下来 q行,每行包含一个整数 k,表示一个询问元素。

    输出格式

    共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。

    如果数组中不存在该元素,则返回 -1 -1

    数据范围

    1&le;n&le;100000
    1&le;q&le;10000
    1&le;k&le;10000

    输入样例:

    6 31 2 2 3 3 4345

    输出样例:

    3 45 5-1 -1

    思路:

    C++中二分法是什么

    【参考代码】

    #include<iOStream>using namespace std;const int N = 100000+10;int q[N];int main(){    int n, m;    cin>> n >> m;        for(int i = 0; i < n; i++) cin>>q[i];    while(m--)    {      int x;      cin>> x;      // 寻找起始位置      int l = 0, r = n - 1;      while(l < r)      {          int mid =(l + r)/2;          if(q[mid] >= x) r = mid;          else l = mid + 1;      }      if(q[l] != x) cout<<"-1 -1"<<endl;      else{          cout<<l<<" ";          // 寻找终点位置          int l = 0, r = n - 1;          while(l<r)          {              int mid = (l + r + 1)/2;              if(q[mid] <= x) l = mid;              else r = mid - 1;          }                    cout<< l << endl;      }           }    return 0;}

    (2).0到n-1中缺失的数字

    (二分) O(logn)
    这道题目给定的是递增数组,假设数组中第一个缺失的数是 x,那么数组中的数如下所示;

    C++中二分法是什么

    从中可以看出,数组左边蓝色部分都满足nums[i] == i,数组右边橙色部分都不满足nums[i] == i,因此我们可以二分出分界点 x 的值。

    另外要注意特殊情况:当所有数都满足nums[i] == i时,表示缺失的是 n。

    时间复杂度分析
    二分中的迭代只会执行 O(logn) 次,因此时间复杂度是O(logn)。

    C++中二分法是什么

    class Solution {public:    int getMissingNumber(vector<int>& nums) {        if(nums.size() == 0) return 0;        int l = 0, r = nums.size() - 1;        while(l < r)        {            int mid = (l + r)/2;            if(nums[mid] != mid) r = mid; //在红色半边(满足条件)            else l = mid + 1;        }                //缺的是n这个数        if(nums[r] == r) r++;                return r;            }};

    二、浮点数二分

    1.浮点数二分模板

    浮点数二分算法模板 —— 模板题 AcWing 790. 数的三次方根bool check(double x) {} // 检查x是否满足某种性质(包含了计算和条件)double bsearch_3(double l, double r){    const double eps = 1e-6;   // eps 表示精度,取决于题目对精度的要求(一般比题目要求的大2)    while (r - l > eps)    {        double mid = (l + r) / 2;        if (check(mid)) r = mid;        else l = mid;    }    return l;}

    注:与整数二分的最大区别是,else那里的条件l = mid不进行+1或者-1,浮点数没有整除(/ 下取整)这种问题,不需要处理边界。

    2.练习

    (1).数的三次方跟

    给定一个浮点数 n,求它的三次方根。

    输入格式

    共一行,包含一个浮点数 n。

    输出格式

    共一行,包含一个浮点数,表示问题的解。

    注意,结果保留 6 位小数。

    数据范围

    &minus;10000&le;n&le;10000

    输入样例:

    1000.00

    输出样例:

    10.000000
    #include<iostream>using namespace std;int main(){       double n;    cin>>n;        double l = -10000, r = 10000;     // eps 表示精度,取决于题目对精度的要求(保险1e-8)    const double eps = 1e-8;      while(r - l > eps)    {        double mid = (l + r) / 2;        if(mid * mid * mid >= n) r = mid;        else l = mid;    }         printf("%.6lf\n", l);    return 0;    }

    (2).一元三次方程求解

    C++中二分法是什么

    提示:记方程f(x)=0,若存在2个数x1和x2,且f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个根。

    #include<iostream>#include<cstdio>using namespace std;double a, b, c, d;// 全局变量方便在cal中使用const double eps = 1e-6;// 定义精度//计算一元三次方程double cal(double x){    return a*x*x*x + b*x*x + c*x + d;}int main(){    cin>>a>>b>>c>>d;        //枚举根    for(int i = -100; i <= 100; i++)    {        //根与根之差的绝对值 ≥1        double l = double(i), r = double(i + 1);// 细节:要将l,r转为double        if(cal(l) == 0) printf("%.2lf ", l); //若f(x) = 0,根即为x                 //f(x1)×f(x2) < 0 根在(x1,x2)之间—— 浮点二分        else if(cal(l) * cal(r) < 0)        {            while(r - l > eps)            {                //x1 < x,f(x1)×f(x2)<0,则在(x1, x2)之间一定有一个根                double mid = (l + r)/2;                // check()条件                if(cal(l) * cal(mid) <= 0) r = mid;                else l = mid;            }                        printf("%.2lf ", l);        }    }}

    C++中二分法是什么

    【参考代码】

    #include <bits/stdc++.h>using namespace std;double check(double x){    return 7*x*x*x*x + 5*x*x*x + 11*x + 6;} double erfen(double Y){    double l=0.0, r=99.0, mid;    while(r - l > 1e-6){        mid = (l + r)/2;        if(check(mid) > Y) r = mid;        else l = mid;    }    return mid;}int main(){    double Y;    while(~scanf("%lf", &Y)){        if(Y < 6 || Y > 677269824)            puts("None");        else        printf("%.4f\n", erfen(Y));    }    return 0;}

    感谢你能够认真阅读完这篇文章,希望小编分享的“C++中二分法是什么”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网其他教程频道,更多相关知识等着你来学习!

    --结束END--

    本文标题: C++中二分法是什么

    本文链接: https://lsjlt.com/news/321893.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • C++中二分法是什么
      这篇文章主要介绍了C++中二分法是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、整数二分单调性与二分的关系:有单调性一定可以二分,用二分不一定是单调性。二分的本质不是...
      99+
      2023-06-29
    • C++迭代器与二分查找方法是什么
      本篇内容主要讲解“C++迭代器与二分查找方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++迭代器与二分查找方法是什么”吧!boolsearch_value_loop(std::vec...
      99+
      2023-06-04
    • C++二分查找与递归的方法是什么
      本篇内容主要讲解“C++二分查找与递归的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++二分查找与递归的方法是什么”吧!#include//#include//#include//...
      99+
      2023-06-04
    • 关于C++中二分法详解
      目录一、整数二分1.整数二分模板2.求解二分问题的思路3.练习二、浮点数二分1.浮点数二分模板2.练习三、总结一、整数二分 单调性与二分的关系:有单调性一定可以二分,用二分不一定是单...
      99+
      2024-04-02
    • 什么是二分查找
      本篇内容主要讲解“什么是二分查找”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是二分查找”吧!二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要...
      99+
      2023-06-28
    • 什么是二分搜索树
      这篇文章主要介绍“什么是二分搜索树”,在日常操作中,相信很多人在什么是二分搜索树问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是二分搜索树”的疑惑有所帮助!接下来,请跟着...
      99+
      2024-04-02
    • C#二分查找算法
      1、定义: 折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。 要计算把目标值插入到该数组中的索引值。最开始的思路: ①.先把目标数插入到数组中 ②...
      99+
      2024-04-02
    • python中二分查找的原理是什么
      这篇文章将为大家详细讲解有关python中二分查找的原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多大...
      99+
      2023-06-14
    • java中二分查找的原理是什么
      java中二分查找的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、...
      99+
      2023-06-14
    • Java中的二分查找是什么意思
      本篇内容主要讲解“Java中的二分查找是什么意思”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的二分查找是什么意思”吧!需求对于一个有序的数组进行二分查找{1,8,10,89,1000...
      99+
      2023-06-15
    • C++ LeeCode二叉树的中序遍历是什么
      这篇文章主要介绍了C++ LeeCode二叉树的中序遍历是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++ LeeCode二叉树的中序遍历是什么文章都会有所收获,下面我们一起来看看吧。一、题目二、代码c...
      99+
      2023-06-19
    • C#二分查找算法怎么用
      这篇“C#二分查找算法怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#二分查找算法怎么用”文章吧。1、定义:折半搜索...
      99+
      2023-06-30
    • C#中List用法是什么
      这篇文章将为大家详细讲解有关C#中List用法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、#List泛型集合集合是OOP中的一个重要概念,C#中对集合的全面支持更是该语言的精华之...
      99+
      2023-06-22
    • C#中checkedlistbox用法是什么
      C#中的CheckedListBox是一个Windows Forms控件,它允许用户在列表中选择多个选项,并将选择的选项以复选框的形...
      99+
      2023-09-15
      C#
    • c语言二级指针是什么
      C语言中的二级指针是指一个指针变量的指针。它是指向指针的指针,也被称为指向指针的指针。可以简单理解为指向指针的指针变量。例如,有一个...
      99+
      2024-02-29
      c语言
    • php数组中二分查找指的是什么
      这篇文章主要介绍php数组中二分查找指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用框架。2、Phalcon,P...
      99+
      2023-06-14
    • c#二维数组行列转换的方法是什么
      在C#中,可以通过以下方法来进行二维数组的行列转换: int[,] originalArray = new int[3, 4] { ...
      99+
      2024-04-02
    • C语言二分查找法怎么用
      这篇文章主要讲解了“C语言二分查找法怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言二分查找法怎么用”吧!示例 1:输入: nums = [-1,0,3,5,9,12], targ...
      99+
      2023-06-30
    • C#中Finally的用法是什么
      这篇文章主要介绍“C#中Finally的用法是什么”,在日常操作中,相信很多人在C#中Finally的用法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中Finally的用法是什么”的疑惑有所帮助!...
      99+
      2023-06-17
    • C#中Invoke的用法是什么
      这篇文章主要介绍“C#中Invoke的用法是什么”,在日常操作中,相信很多人在C#中Invoke的用法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中Invoke的用法是什么”的疑惑有所帮助!接下来...
      99+
      2023-06-20
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作