二分查詢演算法:
二分查詢演算法就是從單調有序的集合中從兩端不斷查詢元素,然後不斷縮小範圍直至查到該元素或縮至最小無解的過程。
時間複雜度:o (logn),優於直接順序查詢o(n)
例:
//x:待查詢的元素, n:陣列集合大小, num陣列單調遞增
int low=0,high=n,mid,res = -1; //low:集合下界 high:集合上節
while(low<=high)
else if(num[mid]三分法:
當需要求某凸性或凹形函式的極值,通過函式本身表示式並不容易求解時,就可以用三分法不斷逼近求解。
例:
類似二分的定義left和right
mid = (left + right) / 2
midmid = (mid + right) / 2;
如果mid靠近極值點,則right = midmid;
否則(即midmid靠近極值點),則left = mid;
double mid, midmid;
while ( low + eps < high )
double cal(double x)
在實際問題中,有時利用二分、三分法可以較為精確地求解出一些臨界值。dp:
dp的種類有很多:經典dp,區間dp,樹形dp,數字dp,概率(期望)dp,狀壓dp,資料結構優化的dp等。動態規劃真的是很多,是難點。這大概也是比賽時很多同學卡住的原因吧,老師說dp沒什麼好辦法,多做題唄。現在的題目很多就感覺很不簡單了,以後還有這麼多,感覺壓力好大。還是要多看資料,多做題啊。
狀壓dp是基於狀態壓縮的動態規劃,又叫做集合動態規劃。
這是一類以集合為狀態的特殊的動態規劃問題。有些時候,需要被記錄到得狀態有很多,但是對每個狀態都開一維來記錄顯然是行不通的,我們就考慮把這些狀態壓縮一下,通常情況下,若只有兩種狀態,我們會把狀態用二進位制表示,每個格仔的狀態只有1或0,然後把它轉成十進位制來記錄。
二分三分法
x 待查詢的值,caculate 所要查詢的函式,這裡單調遞增。double low 區間下界 high 區間上界 mid while high low 1.0e 6 有區間下界left,區間上界right,mid為中點,midmid為靠近right的四等分點。即 mid left right 2 ...
二分三分法 (二)
最近剛學了二分法,還沒有學三分,所以在上課之前,把三分總體的預習了一下,感覺三分應該和二分大體的思路還是一致的,二分的思路是在乙個單調的數列基礎上,每次都求中間值,然後不斷縮小,最後求出解,這樣可以把時間壓縮到最小化。然而三分主要運用的方面是針對於數列是凹函式或者凸函式,先將乙個區間分成3份,每份佔...
三分法小結
二分法作為分治中最常見的方法,適用於單調函式,逼近求解某點的值。但當函式是凸性函式時,二分法就無法適用,這時三分法就可以 大顯身手 如圖,類似二分的定義left和right,mid left right 2,midmid mid right 2 如果mid靠近極值點,則right midmid 否則...