三分搜索

今天學習了三分搜索。
三分搜索的思路爲:把一段範圍分成三段(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倍以上

發佈了26 篇原創文章 · 獲贊 0 · 訪問量 8971
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章