1 二分查詢的思想
每次將待查詢元素與區間中間元素進行比較,將查詢區間縮減為之前的一半,直到找到待查詢元素或查詢區間大小為0。
2 實現及關鍵點
2.1 關鍵點
1)迴圈退出條件
迴圈退出條件為low <= high,其中low為查詢區間的下邊界、high為上邊界,而不是low < high。如果條件為low < high,那麼當查詢區間大小為1即low = high時,迴圈退出就無法與最後乙個資料元素進行比較。
2)區間中間索引mid的取值
一般來說mid = (low + high) / 2,但是當low + high超出其資料型別範圍時會造成溢位,所以這樣的mid取值是不穩妥的。mid = low + (high - low) / 2這樣減少了溢位的可能,或者mid = low + ((high - low) >> 1)這樣通過位運算使得計算更加快速。
3)區間上下邊界的更新
更新應為low = mid + 1、high = mid - 1而不是low = mid、high = mid。因為如果是low = mid、high = mid的更新方式,那麼當查詢區間為1時而最後的資料元素又不等於查詢元素,那麼程式會進入死迴圈。
2.2 實現
1/*查詢公升序陣列中是否存在資料元素num,存在返回其在陣列中的位置,不存在則返回-1*/2
int binarysearch(int* parrnum, int n, int
num)
1314
return -1
;15 }
2.3 複雜度
時間複雜度o(logn),空間複雜度o(1)。
3 適用場景
1)有序陣列。二分查詢演算法依賴於按照下標隨機訪問元素,所以必須是陣列;其次,二分查詢針對的資料必須是有序的,如果無序要先對其進行排序。
2)資料量太小不適合二分查詢。如果資料量太小,例如只有10個資料元素,那麼順序查詢就足夠了。但是如果兩個資料元素的比較操作耗時較多時,例如長度較大的字串比較,那麼還是二分查詢合適,因為二分查詢比較次數較少。
3)資料量太大不適合二分查詢。陣列這種資料結構的對記憶體依賴較大,要求分配連續的記憶體空間,當資料量較大時很可能會導致記憶體分配失敗。
4 二分查詢的變式
1)查詢第乙個值等於給定值的元素;
2)查詢最後乙個值等於給定值的元素;
3)查詢第乙個大於等於給定值的元素;
4)查詢最後乙個小於等於給定值的元素;
變體的二分查詢問題要注意一下幾個細節:迴圈退出條件、區間上下界更新方法和返回值選擇。寫二分查詢**時不要過於追求完美、整潔的寫法,**易讀、沒有bug更重要。
1/*查詢第乙個等於給定值的元素,存在返回其在陣列中的位置,不存在則返回-1*/2
int searchfirstelem(int* parrnum, int n, int
num)
1415
return
first;16}
1718
/*查詢最後乙個等於給定值的元素,存在返回其在陣列中的位置,不存在則返回-1
*/19
int searchlastelem(int* parrnum, int n, int
num)
3132
return
last;33}
3435
/*查詢第乙個大於等於給定值的元素,存在返回其在陣列中的位置,不存在則返回-1
*/36
int searchfirstgigorequalelem(int* parrnum, int n, int
num)
4748
return
first;49}
5051
/*查詢最後乙個大於等於給定值的元素,存在返回其在陣列中的位置,不存在則返回-1
*/52
int searchlastlittleorequalelem(int* parrnum, int n, int
num)
6364
return
last;
65 }
該篇部落格是自己的學習部落格,水平有限,如果有**理解不對的地方,希望大家可以指正!
STL中的二分查詢(binary search)
stl中對於有序序列 vector,list等 提供了相當相當強大的二分搜尋binary search演算法。對於可以隨機訪問容器 如vector等 binary search負載度為對數級別 logn 對於非隨機訪問容器 如list 則演算法複雜度為線性。現在簡要介紹一下幾種常用的binary s...
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...
1128 二分 二分查詢
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...