二分查詢其實是很難的問題,主要是邊界問題難以解決,下面就我自己的理解說一說,我們應該如何進行思考。
二分法主要面向兩類問題,
一類是無重複元素的按公升序排序的陣列
另一類是面向有重複元素的陣列。
而每一類都必須面臨兩個難點,對應如下
1:如何將問題的規模減小,因為二分就是分治的應用,我們必須要保證問題在逐步減小,不會出現死迴圈的情況。
2:while迴圈終止的條件,是選用low好,下面來結合這兩個難點,我們想一下如何解決如下幾個問題
這個問題肯定是沒有重複元素的問題,先上一段**
int binary(int key,vectornums)
else if(nums[mid]key)
} return -1;
}
對於問題一:我們可以知道,上面對應的是三段式,當它等於的時候,就直接return這個下標,然後沒找到的話,就需要進行丟棄一半的元素,例如key>nums[mid],那麼就會丟棄掉原來的low到mid之間的所有元素,總的丟掉的是mid-low+1個元素,這是大於1的,而另外一種情況,key那麼很自然上乙個的mid也等於low=high,那麼這個時候,我們想,那麼上一步的high不就沒有判斷嗎?因為我們判斷的時候就是[low,high],左閉右閉,最後一步,mid=low,此時high決對是沒有判斷的,下一步就會退出,那麼就會誤判。好了這個問題就到此結束
2:有重複元素的陣列,求key的最左邊的那個值的下標,
變形二分查詢
title 資料結構與演算法 專案 主題 二分查詢 description 分析 1 查詢的是乙個有序的資料集合 2 每次查詢都是與區間的中間元素進行對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為0 date 2021 version 0.1版本 author coff...
二分查詢及其變形
一 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。方法一 o n public int minnumberinrota...
二分查詢及其變形
最基本的二分查詢模版 在有序陣列a中查詢key,如果找到,返回位置索引,否則,返回 1 int binarysearch int a,int n,int key else if a mid key else return 1 變種1 如果a有多個key元素,返回最大的,否則,返回 1 int bin...