分治 —— 三分法
【概述】
三分法是二分法的擴展,其用于求凸性或凹形函數的極值,當通過函數本身表達式并不容易求解時,就可以用三分查找來不斷逼近求解。
其原理為:函數中存在一個點 x 是最值,對于 x 的左邊,滿足單調上升(下降),右邊滿足單調下降(上升),然后進行兩次二分,使得不斷的逼近這個 x 點,最后求得答案。
【基本思想】
類似二分的定義 Left 和 Right,對于?[L,R],先找出 lmid,緊接著再找出 rmid,然后比較兩者誰更優,然后舍去不優的。
- mid=Left+(Left-Right)/3
- mid_mid=Right-(Right-Left)/3
若 lmid 靠近極值點,則 Right=rmid,若 rmid 靠近極值點,則 Left=lmid;
要注意的是,若在三分過程中,遇到 f(lmid)=f(rmid) 時,若函數嚴格單調,那么令 left=lmid 或令 right=rmid 均可,若函數不嚴格單調,即在函數中存在一段函數值相等的區間,將無法判斷定義域左右邊界該如何縮小,三分法也就不再適用。
【查找連續函數的寫法】
/*查找函數最大值*/ int BinarySearch(double low,double high){//low為區間下界,high為區間上界 double left,right,mid;left=low;//設置當前查找區間上界的初值 right=high;//設置當前查找區間下界的初值 while(right-left>1.0e-6) { mid=(max+min)/2;//設置中值mid_mid=(mid+max)/2;//設置中值if(Caculate(mid)<Caculate(mid_mid))//若函數結果左值小于右值 left=mid;//調整集合下界 else//否則 right=mid_mid;//調整集合上界 } return Caculate(mid); }【例題】
同題:燈泡(信息學奧賽一本通-T1438):點擊這里
同題:傳送帶(信息學奧賽一本通-T1439):點擊這里
總結
- 上一篇: 三连击(洛谷-P1008)
- 下一篇: 整数大小比较(信息学奥赛一本通-T104