二分查詢是從有序陣列中的中間位置開始查詢特定元素的演算法,又稱折半查詢。
演算法流程:
從有序陣列的中間位置開始與給定元素進行比較。
若二者相等,則返回下標。
若不相等,則在大於或小於給定元素的那一半陣列中重複以上步驟。
若在某一步陣列為空,表明查詢失敗。
每次比較,陣列長度n減小一半,所以二分查詢的時間複雜度為o(logn)。
問題描述:從有序陣列中查詢value,存在返回下標,不存在返回-1。
1.1 非遞迴
int
binarysearch
(vector<
int> array,
int value)
else
if(array[midlle]
< value)
else
return middle;
}return-1
;}
1.2 遞迴int
binarysearch
(vector<
int>
& nums,
int target,
int l,
int r)
問題描述:從給定有序陣列中查詢第乙個等於value的元素,查詢成功返回下標,查詢失敗返回-1。
類似問題:
1.查詢第乙個不小於value的元素。
2.查詢第乙個大於value的元素。
即:stl中的lower_bound()和uppper_bound()。
找到了等於(大於)value的元素,記錄這個下標,繼續到相應的折半陣列中查詢,直到陣列為空。
int
binarysearch1
(vector<
int> array,
int value)
return array[right +1]
== value ? right +1:
-1;}
看array[middle]與value相等時往右還是往左。 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 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...