美文网首页
二分查找

二分查找

作者: mifankai | 来源:发表于2020-03-02 23:57 被阅读0次

    入门

    回顾高中学过的知识,如果求一个单调递增或者单调递减的函数与x轴的交点,即 f(x)=0 时 x 的值, x∈[0,5]


    image

    我们知道 f(0)<0 , f(5)>0 ,那么, f(x) 与x轴的交点的横坐标一定落在区间 (0,5) 内,这时我们取x为0和5的中值,即2.5,发现 f(2.5)<0 ,那么 f(x) 与x轴的交点的横坐标一定落在区间 (2.5,5) 内,同理,我们取新的x为2.5和5的中值,发现 f(3.75)>0 ,那么 f(x) 与x轴的交点的横坐标一定落在区间 (2.5,3.75) 内......如此往复,我们得到的答案就会越来越逼近交点。

    二分思想

    这就是二分算法:通过不断检测左端点和右端点f(x)是否满足题意来减少未知数x的取值范围。这样最后肯定会不断逼近正确答案,直到最终左右端点非常靠近,端点值就是答案。

    来一点数学语言

    设计算x次能够得到答案,n是取值范围大小,即右端点-左端点。那么 2x =n,即经过x次二分可以得到n。 所以二分的时间复杂度是log(n),计算机里log(n)就表示log(n),所以时间复杂度是O(log(n))。

    模板

    普通二分

    int l,r,res;
    //l, r初始化,问题答案的左边界和右边界的确定
    while(l<=r){
      int mid=(l+r)/2;
      if (ok(mid)){
          res=mid;
          r= mid-1;
      }
      else
          l=mid+1;    
    }
    

    浮点数二分模板

    const double eps = 1e-7;
    double l, r;
    // l,r初始化,问题答案的左边界和右边界的确定
    while (l + eps < r){
      double mid = (l + r) / 2.0;
      if (ok (mid)){
          l = mid;
          // r = mid;   
      }
      else {
          r = mid;
          // l = mid;
      }
    }
    

    相关文章

      网友评论

          本文标题:二分查找

          本文链接:https://www.haomeiwen.com/subject/emlnkhtx.html