基礎算法——二分(原理細節與習題概括整理)

目錄:

核心思想:

  一、肯定一個區間,使目標值必定在區間內spa

  二、找到一個性質知足:blog

    (1)具備二段性(便可分紅連續的,性質不一樣的兩段,同一段內性質相同)get

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

1、整數二分:

   簡介:

整數二分由於數在數軸上是離散分佈(即不是連續的),且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"

2、實數二分:

  因爲實數在數軸上連續、稠密分佈,二分時必然能夠求到一個精確的M,不存在整數二分的邊界問題。
  因此實數二分相對比較簡單,只要r-l小於一個足夠小的數前,不斷二分循環畢竟答案便可。惟一須要注意的地方就是通常爲了精確度考慮,二分邊界條件精度到問題所求後兩位。(如:問題要求保留小數點後6位,設置條件時r-l則大於小數點後8位)

3、相關習題:

  (前爲本人題解連接,後位原題連接)

  AcWing790. 數的三次方根  原題連接  (實數二分模板題) 

  AcWing 789. 數的範圍        原題連接  (整數二分模板題、兩類寫法均用到)

相關文章
相關標籤/搜索