二分和三分

2021-10-24 05:53:45 字數 1676 閱讀 9190

三分二分,乙個簡單而神奇的演算法,可以簡化時間複雜度,但是用二分有乙個條件,就是我們進行二分的序列必須有單調性。原理

aa中找乙個數x

xx(保證x

xx一定存在)。

我們可以用樸素演算法,直接從頭到尾找一遍,時間複雜度o(n

)o(n)

o(n)

。如果當序列a

aa的長度十分大時,這種方法就不好用了。

二分橫空出世。

我們每次尋找左右邊界的中間。

如果這個數大於x

xx,右邊界就等於中間。

否則,左邊界就等於中間。

知道找到答案。

**:

#include

using

namespace std;

int n,a[

1005

],x;

intmain()

else l=mid;

}return0;

}

在二分過程中,每次都把查詢的區間減半,因此對於乙個長度為n

nn的陣列,至多會進行o(l

ogn)

o(log\ n)

o(logn

)次查詢,從而起到簡化時間的作用。

三分可以在乙個單峰函式中找出其凸點或凹點。

原理我們就是把[l,

r]

[l,r]

[l,r

]區間分成三份,如果f(m

idl)

>f(

midr

)f(midl)>f(midr)

f(midl

)>f(

midr

),則r=m

id

rr=midr

r=midr

;否則l=m

id

ll=midl

l=midl

(這是求凸點)。

這看起來跟二分很想。

當f (m

idl)

>f(

midr

)f(midl)>f(midr)

f(midl

)>f(

midr

),仔細思考一下,當f(m

idl)

>f(

midr

)f(midl)>f(midr)

f(midl

)>f(

midr

)時,mid

rmidr

midr

一定在凸點右邊,所以我們把r=m

id

rr=midr

r=midr

。否則,我們就把l=m

id

ll=midl

l=midl

,這也十分好理解。

**第一種寫法

double

three_divide

(double l,

double r)

return

f(l)

;}

第二種寫法

double

three_divide

(double l,

double r)

return

f(l)

;}

但其實沒有啥區別。

二分和三分

二分 二分,即為折半查詢,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。也就是說,二分的條件為必須滿足數列或某一邏輯的順序性,單調 只有這樣才能進行二分。查詢方法 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如...

二分和三分

二分查詢 二分的精度問題,一般用double解決,eps 1e 8,關於l,r的取值看那個區間有沒有可能取到,然後 1或者 1,會不會使得值變化得特別大,如果會變化得特別大,那麼就l,r都取mid o log n 查詢乙個數 int b search int x return 1 查詢左邊界 int...

二分和三分題

目錄三分 連續區間最大和 回到頂部 二分答案區間,每次check,檢查兩個標記的距離,如果小於x,那麼去掉。判斷去掉的個數。farmer john建造了乙個有n 2 n 100,000 個隔間的牛棚,這些隔間分布在一條直線上,座標是x1,xn 0 xi 1,000,000,000 他的c 2 c n...