二分一直看不懂,看完這篇恍然大悟。

2021-10-04 08:44:25 字數 1893 閱讀 3860

模擬二分

例題二分,之所以叫二分,是因為每一次我們取的東西都是在正中間。為什麼呢?因為你這樣猜種類每一次都可以去掉當前所剩餘種類的一半

畢竟什麼東西都是需要舉個例子:

就像下面一樣:

就拿猜數遊戲來說吧,如果像簡單查詢一樣逐個去查詢,範圍是1~ 100,數是100的話你要查詢100次,如果範圍加大,數是100億要查詢100億次,那不得找到天荒地老(>=100s)!而用二分法查詢1~100只要用6次絕對可以找到,二分範圍就算到1億都不會超時(<=1s),可見二分的強大。

說到這大家可能已經知道二分的精髓了,就是加速,就如你所說。只不過有乙個小小的缺陷,為什麼呢?就是這個序列必須是有序的,不然就會產生奇妙的反應,在**的執行結果中會給大家展示。

呵呵~~~

二分查詢o(log n),就是根號n。屬於比較穩定的查詢演算法了。

跟其他速度比較

o(1)<o(log n)如果還是猜數遊戲,範圍1~100,數是60看一下:

因為我們每次要猜數的一半

1.猜數是50,比50大,1 ~50排除。一下子就排除了50個數!

2.猜數是75,比75小,75~100排除。剩下的一半

3.猜數是63,比63小,63~74排除。以此類推…

4.猜數是56,比56大,51~56排除。

5.猜數是59,比59大,57~59排除。

6.猜數是61,比61小,61~62排除。

這就已經不用猜數字了,你已經可以很明確的告訴我答案是60!如果不明確,請重複上述過程。

於是我們又一次證明了二分的威力,每次未知數的範圍都是大大減少了!

先來一題簡單題:

從n個數中找出乙個數,返回下標,從1開始,有多個則輸出靠前的座標。沒有則輸出-1。

作者為了裝*,於是使用遞迴寫法:

#include

using

namespace std;

int a[

100]

,x;int binary (

int left,

int right,

int middle)

else

if(a[middle]

else

binary

(left,right,middle);}

intmain()

cin>>x;

int left =1;

//開始的左座標

int right = n;

//開始的右座標

int middle =

(left+right)/2

;//開始的中間座標

cout<<

binary

(left,right,middle)

;}

執行結果如下:

當我們輸入無序數列時:

會是這樣的:

顯然,電腦感到無奈。。。

呵呵呵

眼角劃過的淚,你卻一直看不見

qq個性簽名 眼角劃過的淚,你卻一直看不見 願得一人心,白首不相離。結髮為夫妻,恩愛兩不疑。不要太在乎自己的長相,因為能力不會寫在臉上。明明都捨不得,明明都很愛,為什麼還要互相折磨。乙個人徹悟的程度恰等於他所受痛苦的深度 疏遠誰,有時候並不是討厭,而是太喜歡。依賴很可怕,一旦陷下去了,那人一離開,你...

一直很安靜

阿桑的走,很是突然,之前沒有聽過一點徵兆,突然就走了,其人與我非親非故,只是喜歡她那首 一直很安靜 給你的愛一直很安靜 來交換你偶爾給的關心 明明是三個人的電影 我卻始終不能有姓名 曾經想學這首歌,不過沒 細胞怎麼都學不會,現在將歌詞貼上來,以做紀念 空蕩的街景想找個人放感情 做這種決定是寂寞與我為...

一直報數遊戲

一種報數遊戲是從1開始連續報數,如果報到7的倍數 7,14,21,28 或者包含數字7的數 7,17,27,37 就用拍手代替這個數而不能報出。假設你連續聽到m聲拍手,問造成你聽到m聲拍手的第一下拍手所代表的數是幾?例如,你聽到了兩次連續的拍手,最小的可能這兩次拍手是27和28,因此輸出27。輸入m...