首先是二分查詢,舉個有序的整數陣列例子(二分查詢和搜尋都是針對有序陣列)
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...