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 的最大值 解題思路 當人在最左端的時候影子的長度全部投在地上,漸漸向右走影...