二分查詢(binary search)

2022-09-03 02:27:09 字數 2099 閱讀 2369

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 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...