今天學習了三分搜索。
三分搜索的思路爲:把一段範圍分成三段(1=1/3+1/3+1/3)
左範圍l,右範圍r;
左中點 m = l+(r-l)/3;
右中點 mr = r - (r - l ) /3;
比較 m , mr (根據具體題目要求),舍掉範圍外的另一個,達到縮小範圍的效果。
和之前的二分搜索相比,兩者還是有很多區別的:
1、二分搜索用於一維上範圍內找點,點與點平行。平行的意思是說兩個點位與同一級上,類比數組:
三分搜索則用於二維上範圍內找點,點與點有次序上的大小。
(參考平面座標(1,1)與(0,0)的關係)
因爲是二維關係,所以三分搜索的點在座標系上構成函數:(比如)
2、二分搜索的範圍是單調的,要麼遞增要麼遞減(這應該沒有問題)。
三分搜索的範圍則存在極值(極大或極小),函數圖形爲凸函數或凹函數。
因爲是函數所以一般三分搜索的點都是浮點數,取double。
放個模板:
#define INF 0x3f3f3f3f
#define EPS 1e-8
double r,l;
while(r-l>=EPS){
double m=l+(r-l)/3;
double mr=r-(r-l)/3;
if(dis(m)<=dis(mr)){
r=mr;
}
else{
l=m;
}
}
//dis(),是判斷函數,根據不同題目要求而不同
//在數據大量的情況下,用gets讀取快於scanf()10倍以上