1. 程式人生 > 實用技巧 >二分三分

二分三分

一、概念

在一個單調有序的集合中查詢元素,每次將集合分為左右兩部分,判斷解在哪個部分中並調整集合上下界,重複直到找到目標元素。

時間複雜度:O (logn)

1 double left=“區間下界”,right=“區間上界”,mid;
2 while(right - left > 1.0e-6)
3 {
4      mid = (right + left)/2;
5     if(Caculate(mid)<x)
6         left=mid;
7     else
8         right=mid;
9 }

二、三分法

類似二分的定義left和right

mid = (left + right) / 2

midmid = (mid + right) / 2;

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

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

格式:

 1 double mid, midmid;
 2 while ( low + eps < high )
 3 {
 4     mid = (low + high) / 2;
 5     midmid = (mid + high ) / 2;
 6     double cmid = cal(mid);
 7     double cmidmid = cal(midmid);
 8     if ( cmid > cmidmid ) 
9 high = midmid; 10 else 11 low = mid; 12 }

1 while(l+1e-11<r)    
2     {         
3    lmid=l+(r-l)/3;           
4  rmid=r-(r-l)/3;       
5      if(check(lmid)<=check(rmid)) r=rmid;     
6        else l=lmid;   
7       }