很久以前在csdn的編碼挑戰欄裡第一次看到「90%的程式設計師無法正確實現二分查詢」這種挑釁性的論斷,那時候我還是個演算法盲,基本二分查詢也只是聽說而已,但還是對此深表懷疑。出於各種原因也沒有動手試一試。
近期開始練基本功,到查詢這一塊時,特別留意了下這個話題,原來出自《程式設計珠璣》、《計算機程式設計藝術》等大師經典,像《程式設計之美》等也都有所提及。所以特別在標題中加了「傳說」二字。
試了一試,果真很多坑,比如源資料為空如何處理?待查資料範圍正確,但其實查不到的情況程式會得到什麼結果?
類似的問題這篇文章總結的算是可以了,我這裡就不獻醜了。
二分查詢學習札記
以下是我自己的**,一開始習慣用遞迴,不過引數用vector時,遞迴要做許多無謂的截斷工作,效率應該極低,索性就不遞迴了。
和流傳的「標準」略有不同,不過無傷大雅了。不敢說沒問題,假如有熱心大牛幫忙指出bug,感激不盡。
#include #include using std::cin;
using std::cout;
using std::endl;
using std::vector;
//在有序vector中二分查詢target,返回下標值,若找不到,返回-1
int binary_search(vectorsrc, int target)
if ((target > src[n-1]) || (target < src[0]))
int left = 0;
int right = n-1;
int mid = left + (right - left)/2;
while (src[mid] != target)
else if (src[mid] > target)
if (left > right)
mid = left + (right - left)/2;
}return mid;
}int main()
cin.clear();
cin.sync(); //需清緩衝,否則無法二次使用cin
int target;
cout<<"請輸入需查詢數:";
cin>>target;
cout<<"查詢所得下標為:"<
總體來說研究過這個話題之後,在對程式正確性的認識上還是自感深刻了不少的,可以想象我之前做的那些工程、貼的那些**,不知隱藏著多少bug。
但是無所謂了,不可因噎廢食,只能以後在這方面盡量多注意吧。
另外提下:
靜態查詢不光只有二分查詢一種,其他還有斐波納契查詢、插值查詢等,基本大同小異,只是每次截斷的比例點有所不同,傳說效能上多少有些差異,這裡就暫不深究了。
傳說中的二分法查詢
採用二分法查詢資料元素並不是乙個陌生的行為,而可能只是乙個陌生的詞彙而已。二分法說的是從乙個有序序列中查詢某個元素時,先和這個序列的中間值比較,如果中間值小,則再從中間位置到末尾的一半序列中查詢,仍然先和中間值比較,以此類推。如果中間值大,則再從開始位置到中間位置的一半序列中查詢,仍然先和中間值比較...
傳說中差分kmp
codeforces 471d 題意 你建造了一堵牆,這堵牆是由n個塔組成的,每個塔相互連線,且各自有乙個高度,你給你自己的牆起了乙個名字,叫大象。豬也建造了一堵牆。問你最多能從豬建的牆中找到幾個大象。你可以將你自己的牆中的塔向上提公升,或者下降,可以降到地下。解析 開始題意沒有理解。不是你對牆做任...
傳說中的MTU
通訊術語 最大傳輸單元 maximum transmission unit,mtu 是指一種通訊協議的某一層上面所能通過的最大資料報大小 以位元組為單位 最大傳輸單元這個引數通常與通訊介面有關 網路介面卡 串列埠等 網際網路協議允許ip分片,這樣就可以將資料報分成足夠小的片段以通過那些最大傳輸單元小...