码迷,mamicode.com
首页 > 编程语言 > 详细

基础算法——二分(原理细节与习题归纳整理)

时间:2020-01-13 09:23:00      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:http   html   简介   离散   退出   win   链接   ref   三次   

目录:

核心思想:

  1、确定一个区间,使目标值一定在区间内

  2、找到一个性质满足:

    (1)具有二段性(即可分成连续的,性质不同的两段,同一段内性质相同)

    (2)答案是二段性的分界点;

一、整数二分:

   简介:

整数二分因为数在数轴上是离散分布(即不是连续的),且int型变量默认向下取整,所以实现的时候很容易出现死循环的情况。这里给出两类整数二分的实现方法及其相关原理,可以有效避免死循环的情况; 

      第一类:

        技术图片

      ans(答案)是红色区间的右端点。将【L,R】分成【L,M-1】、【M,R】两个区间。

      if M在红色区间内,说明ans必然在【M,R】区间;

      else ans必然在【L,M-1】区间;

      伪码如图:

        技术图片

PS:如上图证明:求M时若不“+1”,当L=R-1且第一个条件满足时,L永远不变,循环无法退出。

    第二类:

        技术图片

       ans是绿色区间的左端点。将【L,R】分成【L,M】、【M+1,R】两个区间。

       if M在绿色区间内,说明ans必然在【L,M】中;

       else ans必然在【M+1,R】中;

      伪码如图:

        技术图片

        PS:这里求M时无需“+1”,如图证明可知若“+1”当条件一成立时,程序会陷入死循环。

    小结:

      整数二分步骤:

      1. 找一个区间【L,R】,使得answer一定在该区间内
      2. 找一个判断条件,使得该条件具有二段性,并且答案一定是该二段性的分界点
      3. 分析中点M在该条件下是否成立,
         如果成立,考虑答案在哪个区间;
         如果不成立,考虑答案在哪个区间;
      4. if更新方式写的是:
         R=Mid; 不用任何处理
         L=Mid; 计算Mid时"+1"

二、实数二分:

  由于实数在数轴上连续、稠密分布,二分时必然可以求到一个精确的M,不存在整数二分的边界问题。
  所以实数二分相对比较简单,只要r-l小于一个足够小的数前,不断二分循环毕竟答案即可。唯一需要注意的地方就是一般为了精确度考虑,二分边界条件精度到问题所求后两位。(如:问题要求保留小数点后6位,设置条件时r-l则大于小数点后8位)

三、相关习题:

  (前为本人题解链接,后位原题链接)

  AcWing790. 数的三次方根  原题链接  (实数二分模板题) 

  AcWing 789. 数的范围        原题链接  (整数二分模板题、两类写法均用到)

基础算法——二分(原理细节与习题归纳整理)

标签:http   html   简介   离散   退出   win   链接   ref   三次   

原文地址:https://www.cnblogs.com/yifeianyi/p/12185486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!