模擬二分
例題二分,之所以叫二分,是因為每一次我們取的東西都是在正中間。為什麼呢?因為你這樣猜種類每一次都可以去掉當前所剩餘種類的一半
畢竟什麼東西都是需要舉個例子:
就像下面一樣:
就拿猜數遊戲來說吧,如果像簡單查詢一樣逐個去查詢,範圍是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...