別人不知道,反正我早上是寫了好久,這個查詢演算法,將查詢的複雜度從 o( n ) 降到了 o( logn ) ,當之無愧的的好演算法,更是許多高階演算法的優化策略之一。
二分查詢之基本思路
雖然二分查詢是乙個很吊的演算法,但是跟很多演算法一樣,需要使用的基礎條件——序列有序!
先假設乙個單調非增序列:1 2 3 4 5 6 ,求找到3的位置,地球人都會馬上這麼想——乙個乙個找咯,可是這樣很慢!
於是有人想要加快查詢速度,他們發現如果從中間開始找,那麼每次比較後就至少可以排除一半的數,這就是二分查詢的基本思想——折半。
1)設定三個指標變數(應該說是指標性質的變數,索引也是可以的)——low
,mid 和 high,並且滿足 mid = ( low + high ) / 2;
2)設定迴圈,進行target值與mid儲存值的比較,根據比較結果更新low或者high;
3)在
2)中,若出現找到target的情況,則返回mid指標;如果一直找不到,則返回空指標。
下面是**:
//方法一看起來好像沒什麼問題,實際上在一些情況下 ,答案會很奇怪:1 2 2 4 5,我們如果找2,答案 -> 2 (這是索引啊!)int binary_search(int n, int v)
return -1;
}
那麼問題來了,為什麼是返回第二個,而不是第乙個呢?其實很簡單,當序列出現重複元素時,我們找到了當然是其中「任意」乙個啦!
但是其實往往我們需要處理的序列總是擁有重複元素的,所以,我們需要優化!
我們先來分析原來的二分查詢 —— left < mid所以,我們不妨按這種規則來二分 —— left <= mid < right !
我們可以看看**:
//方法二:返回第乙個位置int lowerbound(const int a,const int size,const int target)
if(a[high]==target) return high;
else return -1;
}
整理 二分查詢延伸
找出乙個有序字串陣列arr中值等於字串v的元素的序號,如果有多個元素滿足這個條件,返回其中序號最大的?類似 在有序整數陣列中查詢指定數值,若有多個元素滿足這個條件,返回其中序號最小的?include using namespace std int binary search int arr,int ...
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...
演算法整理 二分查詢和排序
1.二分查詢 1 有序陣列查詢插入位置 主要是終止條件的判斷,如果查詢不到需要被範圍的插入位置為begin public int searchinsert vector nums,inttarget private int binarysearch vector nums,int target,in...