二分思想(整數數列上的二分 實數域上的二分)

2021-08-28 08:28:54 字數 884 閱讀 1599

其實對於二分來說,我們可以分為兩類:1、整數域上的二分   2、實數域上的二分

但是總的二分的條件都是一樣的:需要序列具有單調性。

1、整數域上的二分,分三步 (其中mid最好是》1 而不是/2, 因為》1 是向下取整,而/2是向0取整,在負數時很有用)

(1)通過分析具體問題,確定左右半段哪乙個是可行區間,以及mid歸屬那一半段。

(2)根據分析結果,選擇「r=mid, l=mid+1, mid=(l+r)>>1」 和 「l=mid,  r=mid-1, mid=(l+r+1)>>1」兩個配套形式之一。

(3)二分終止條件是l==r, 該值就是答案所在位置。

(一定要注意區間的選擇,區間[0,n] 和 [1,n+1] 這兩個不能夠亂用 ,0和n+1 都是越界下標,只有在特定情境下若沒有找到才會等於越界下標)

例子:在單調遞增序列a中查詢》=x的數中的最小的乙個:

while(l>1;

if(a[mid]>=x) r=mid; else l=mid+1;

}return a[l];

在單調遞增序列a中查詢<=x的數中的最大的乙個:

while(l>1;

if(a[mid]<=x) l=mid; else r=mid-1;

}return a[l];

2、實數域上的二分(重點是精度的確定)

在實數域上的二分簡單,重要的是確定好所需的精度eps,以l+eps有時精度不容易確定或者表示,就乾脆採用迴圈固定次數的二分方法,也是一種相當不錯的策略。這種方法得到的結果的精度通常比設定eps更高。 ----摘自《演算法競賽高階指南》

for(int i=0;i<100;i++)

二分實數總結

二分這個演算法就不說了,直接上乙個題目吧,二分實數看演算法競賽指南上的題解勉強看懂,這題主要是讓我求乙個乙個陣列之中大於l長度的最大平均數。書上大概都有,我就簡單說下單調性吧。任意數列減去自己的平均數後總和為0如果乙個數字小於平均值的話,減去這個數字後總和將會大於0,而如果大於平均值的話總和將會變成...

二分 整數二分和浮點數二分

一定是單調的才可以二分。找中間點 判斷是否滿足check函式 此函式需要自己根據題意調整,假設紅色區域為滿足check函式,說明mid在紅色區域內,此時要在mid到r之間找,l mid,否則r mid 1。由於此時l mid 所以中間點應為 l r 1 2 中間點mid l r 2 mid l r ...

2019 08 08 二分思想

今天做了一道二分題 感覺二分仍需要加強 乙個經典題目 求乙個遞增陣列裡某個數字出現次數 我們第一想法 暴力 的確可以 邊讀入邊判斷是否為我們要的那個數 這種複雜度是o n 有沒有更高效演算法呢?二分!我們可以二分查詢陣列中這個數出現的第乙個位置和最後乙個位置 數量不就得出來了嗎 那麼怎麼二分呢?我們...