二分三分法總結

2021-07-31 15:07:21 字數 2019 閱讀 4947

1 二分法,是一種降低dp複雜度的有效演算法,二分查詢用於在多條記錄中快速找到待查詢的記錄。它的思想是:每次將查詢的範圍縮小一半,直到最後找到記錄或者找不到記錄返回!

2 簡單定義:在乙個單調有序(注意一定是有序)的集合中查詢元素,每次將集合分為左右兩部分,判斷解在哪個部分中並調整集合上下界,重複直到找到目標元素。

3 二分查詢的時間複雜度為o(logn)

演算法:當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。

基本思想:假設資料是按公升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功;若x小於當前位置值,則在數列的前半段中查詢;若x大於當前位置值則在數列的後半段中繼續查詢,

直到找到為止。

演算法如下:

1.確定查詢範圍front=0,end=n-1,計算中項mid(front+end)/2。

2.若a[mid]=x或front>=end,則結束查詢;否則,向下繼續。

3.若a[mid]x,說明待查詢的元素值只可能在比中項元素小的範圍內,則把mid-1的值賦給end,並重新計算mid,轉去執行步驟2

4 二分法的歸和非遞迴演算法如下:

(1)非遞迴:

nt binary_search(int arr,int n ,int key)else  

} return -1;//沒有找到元素,返

(2)遞迴:

int binary_search(int arr,int low,int high,int key)else  

}

常見拓展:

對於某些問題,如果答案具有特定的範圍,並且驗證答案是否成立的函式具有單調性。則可以在範圍內對答案進行二分驗證,從而快速確定答案

典型例題:

hdu 1551 cable master

將n根網線切成k段相同長度的網線,問可切成的最長長度是多少;

思路:利用二分發查詢答案,每次偏右查詢(因為要查詢大的)

關鍵**:

int n,k;

double a[10005],sum;

int judge(double s)

int main()

printf("%.2f\n",l);

}return 0;

}

二、三分法

當需要求某凸性或凹形函式的極值,通過函式本身表示式並不容易求解時,就可以用三分法不斷逼近求解。

類似二分的定義left和right

mid = (left + right) / 2

midmid = (mid + right) / 2;

如果mid靠近極值點,則right = midmid;

否則(即midmid靠近極值點),則left = mid;

例子:zoj 3203 light bulb

如圖,人左右走動,求影子l的最長長度。

根據圖,很容易發現當燈,人的頭部和牆角成一條直線時(假設此時人站在a點),此時的長度是影子全在地上的最長長度。當人再向右走時,影子開始投影到牆上,當人貼著牆,影子長度即為人的高度。所以當人從a點走到牆,函式是先遞增再遞減,為凸性函式,所以我們可以用三分法來求解。

題意是給定如圖的h,h,d,求最大的影子l。

如圖所示,設x,y。

由三角形相似得,x / y = h / (y + d) 。

解得:y = x * d / (h - x)。

由三角形相似得,x / y = h / (y + l -x)。

帶入y,解得 l = x + d * (h - x) / (h - x)。

核心**:

double mid, midmid;

while ( low + eps < high )

double cal(double x)

對於求解一些實際問題,當公式難以推導出來時,二分、三分法可以較為精確地求解出一些臨界值,且效率也是令人滿意的。

靈活應用這些方法對解題會很有幫助。

二分三分法

x 待查詢的值,caculate 所要查詢的函式,這裡單調遞增。double low 區間下界 high 區間上界 mid while high low 1.0e 6 有區間下界left,區間上界right,mid為中點,midmid為靠近right的四等分點。即 mid left right 2 ...

二分三分法 (二)

最近剛學了二分法,還沒有學三分,所以在上課之前,把三分總體的預習了一下,感覺三分應該和二分大體的思路還是一致的,二分的思路是在乙個單調的數列基礎上,每次都求中間值,然後不斷縮小,最後求出解,這樣可以把時間壓縮到最小化。然而三分主要運用的方面是針對於數列是凹函式或者凸函式,先將乙個區間分成3份,每份佔...

二分和三分法

二分法作為分治中最常見的方法,適用於單調函式,逼近求解某點的值。但當函式是凸性函式時,二分法就無法適用,這時三分法就可以 大顯身手 如果圖形是上凸或者下凸的,就可以用三分法求 極點。題目大意 求人從左向右走動時,影子的長度l 的最大值 解題思路 當人在最左端的時候影子的長度全部投在地上,漸漸向右走影...