1. 程式人生 > >分治(二)——三分法學習筆記

分治(二)——三分法學習筆記

答案具有可二分性時,我們可以用二分答案來解決。但是,如果要求出凸性函式凹性函式的最值時,二分就毫無用武之地了,這時,我們就可以用三分法來求出答案。 

一個凸性序列/凹性序列通俗的說法就是在該序列最大值/最小值的左邊滿足不嚴格單調遞增/遞減,右邊滿足不嚴格單調遞減/遞增。如1,2,3,6,4是一個凸性序列,而5,4,4,3,1,2,4,6是一個凹性序列(見下圖),而圖中的6和1就分別是兩個序列的最值。

與二分法類似的是,三分法也先取下界(記作l)和上界(記作r)的中間值(記作midl),隨後,再取midl與r的中間值(記作midr)。接下來,我們要比較midl和midr所在的元素哪一個更接近最值,並依此更新上界和下界。不斷重複以上操作,直至l>=r,則此時的l就是答案。

具體實現後得出的程式碼如下:

//這裡以在一個凸性序列中查詢元素為例
int find(int l,int r,int v)//l儲存上界,r儲存下界,v即為目標元素
{
    if(l>=r) return l;//返回答案
    int midl=(l+r)>>1,midr=(midl+r)>>1;
    //比較midl與midr的大小
    if(sum[midl]>sum[midr]) return find(l,midr);//若midl大於midr,說明最大值在左側區間
    return find(midl,r);//反之,說明最大值在右側區間
}

注:如果您通過此文學會了三分法,請您點個贊再離開。當然,也歡迎在討論區指出此文的不足處,作者會及時對此文加以修正
版權宣告:轉載請註明地址