二分查詢 整理

2022-05-03 17:12:08 字數 1303 閱讀 9060

別人不知道,反正我早上是寫了好久,這個查詢演算法,將查詢的複雜度從 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指標;如果一直找不到,則返回空指標。

下面是**:

//方法一

int binary_search(int n, int v)

return -1;

}

看起來好像沒什麼問題,實際上在一些情況下 ,答案會很奇怪:1 2 2 4 5,我們如果找2,答案 -> 2 (這是索引啊!)

那麼問題來了,為什麼是返回第二個,而不是第乙個呢?其實很簡單,當序列出現重複元素時,我們找到了當然是其中「任意」乙個啦!

但是其實往往我們需要處理的序列總是擁有重複元素的,所以,我們需要優化!

我們先來分析原來的二分查詢 —— 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...