關於二分查詢和二分搜尋

2021-08-16 19:13:28 字數 1759 閱讀 5489

首先是二分查詢,舉個有序的整數陣列例子(二分查詢和搜尋都是針對有序陣列)

public int rank(int key, int n)  else if (cmp > 0)  else 

}return lo;

}

如果查詢到,返回陣列下標mid,如果沒找到,return lo;有人會問了為什麼返回lo??當然你非要在找不到的情況下返回乙個負數比如-1也可以。這就是關鍵所在,假設a[10]=;我要查詢的key是6。

第一步:lo   hi   mid

0     9     4        

0     3     1        a[4]=7 > key=6,所以hi=mid - 1=3;    lo=0  <=  hi=3繼續迴圈,mid=(lo+hi)/2=1

2     3     2        cmp = 6-a[1] > 0,所以lo=mid+1=2,lo=2  <=  hi=3繼續迴圈,mid=(lo+hi)/2=2

3     3     3        cmp = 6-a[2] > 0,所以lo=mid+1=3,lo=3  <=  hi=3繼續迴圈,mid=(lo+hi)/2=3

3     2               cmp = 6-a[3] < 0,所以hi=mid-1=2,此刻不滿足套件,跳出,返回lo=3

返回3什麼意思?你看看這個陣列,是不是小於6有3個元素?

lo的值正好等於陣列中小於被查詢的元素的數量

那怎麼知道有沒有找到呢?返回的到底是命中的下標還是小於被查詢元素數量呢? 

用  i=rank(key, n); // 在n個元素的陣列查詢key=6,返回下標傳給i

if (i

else  {沒找到}

一些有序集合判斷,如果集合包含這些元素,就更新數值,if(i

下面講一下二分搜尋

比如從有序陣列中查詢某個數值

lower_bound

給定長度為n的單調不下降數列

a0, a1,

...a

n-1和乙個數k,求滿足ai

≥k條件的最小的i。不存在的情況輸出n。

限制條件

1≤n≤

1060≤

a0≤a

1≤...≤a

n-1<1090≤k

≤109輸入

n = 5

a =

k = 3

輸出1(其中a0

<3, a1>=3)

這裡不僅僅是二分查詢了,不僅是找到下標,而是找到最小的下標

直接上**(關鍵部分)

int n, k;

int a = new int[1000001];

public void solve() else

}system.out.println(hi);// 最後hi和lo一樣,就算找不到的情況返回n,這種情況下lo=hi=n,返回哪個都一樣

}

比如a[5]=

a[2]=3和3進行比較,可以知道解不大於2

a[1]=3和3比較,可以知道解不大於1

a[0]=2和3比較,可以知道解不小於0

所以解為1

二分搜尋法是通過不斷縮小解的可能存在的範圍,從而求得問題最優解的方法。

****************************************talk is cheap, show me the code***********************************====

Java 二分搜尋 二分查詢

對陣列元素進行逐個查詢顯然是費時費力的工作,我們可以使用一些方法快速地搜尋出陣列中元素的指定位置.接下來我們介紹一種方法 二分搜尋法 二分搜尋法充分利用了元素間的次序關係.基本思想 將n元素分成個數大致相同的涼拌,取arr n 2 與欲查詢的x做比較,如果 下面將採用兩種方式 遞迴 非遞迴 來展示二...

二分搜尋與STL二分查詢

用法 搜尋非遞減數列中是否包含某個元素 當資料量比較大的時候,二分比線性搜尋高效得多。流程 查詢36 實現 物件是非遞減序列,如果當資料無序時,需要預先進行一次排序。int binarysearch int a,int key,int n n為陣列長度 rerurn 0 陣列a中不存在key 複雜度...

二分查詢和二分答案

1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...