二分查詢的特性及應用

2021-10-03 06:29:22 字數 1504 閱讀 4042

如果我們熟悉二分查詢,我們就知道二分查詢有乙個重要的基礎,就是需要有序的順序表。這裡有兩點,乙個是有序,另乙個是順序表。一般來說,只要是查詢的題目,和這兩者掛上鉤,基本就是二分查詢無疑了。因為二分查詢過於重要,建議大家自己要能寫出**。

統計乙個數字在乙個排序陣列**現的次數。

如果說從前往後掃瞄乙個陣列,統計這個數字在陣列**現的次數,顯然複雜度是o(n

)o(n)

o(n)

的,完全用不到排序陣列這個特點。我們要想用上這個特點,在乙個排序陣列中乙個數字出現多次的話,顯然這寫數字是擠在一處的,我們只需要找到第一次出現的位置,然後找到最後一次出現的位置,顯然就可以輕鬆得到這個數字出現的次數。那就是在有序陣列中找第一次出現的位置和最後一次出現的位置。不用說了,必然二分查詢。

但是我們知道普通的二分查詢是找乙個數字出現的位置,如果這個數字出現多次,二分查詢只能返回其中乙個的位置。而這個時候,我們就需要對**進行修改,修改為可以保證只查詢到該數的第乙個數字或者最後乙個數字。這個時候就完成了任務。但是這樣可能就要寫兩個函式,乙個找第一次出現的位置,乙個找最後一次出現的位置。

我們可以對這個問題稍微做一做變通,我們在學習有序表的插入時候,可以通過二分查詢找到插入的位置,我們也可以對**進行修改,保證相同的數插入在最後面或者最前面。我們以插在最前面為例。插在最前面的位置顯然就是這個數的起始位置(如果存在),我們可以通過這個函式來轉換一下找到這個數的最後位置。如果我們的陣列是整數型別,那麼顯然這個數加1的數的插入位置就是下乙個數的起始位置,這個數的起始位置應該前面就是我們要找的數。兩個索引之差就是要找的數的個數。如果這個數不存在,顯然這個數的插入位置和下乙個數的插入位置就是同乙個位置,這個時候兩個索引之差為0,也滿足我們所述的關係,分析完畢。

c++**

class

solution

intbinarysearch

(vector<

int> data,

double k)

if(data[mid]

>= k)

end = mid -1;

else

begin = mid +1;

}return begin;}}

;

事實上這個問題可以進一步拓展,如果陣列是整數,我們需要統計a的個數,我們可以在兩邊找緊鄰著這個數但是陣列中不存在的數(顯然a-0.5和a+0.5就滿足條件)的插入位置,這兩個位置的間隔就是a的個數。

再次強調一遍,只要是有序陣列的查詢,必然和二分查詢分不開了。要注意會轉換問題。這裡再需要補充的一點是,二分查詢是基於分治的,如果乙個陣列即便不是有序的,但是可以劃分成子問題,而且子問題的性質和原來問題的性質是一樣的,並且這個劃分可以根據特性排除掉乙個子問題,這個時候就滿足二分法的需求了。比如下面這個問題:

二分法示例補充

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note:給出的所有元素都大於0,若陣列大小為0,請返回0。

補充示例:二分查詢的應用

二分查詢及遞迴的二分查詢

一 思路 二分查詢又名折半查詢,顧名思義是分成兩部分,每查詢一次資料減半,所以查詢起來會很快。但是二分查詢的條件是已經有序的資料。1 設定兩個變數i,j.為查詢的範圍,i一般為0,j一般為陣列長度減一 2 設定變數mid,mid為所查陣列範圍的中間位置,即mid i j 2 3 比較所要查詢的資料v...

二分查詢及變種二分查詢

二分查詢也稱折半查詢 binary search 它的查詢效率很好。二分查詢有乙個要求是必須採用順序儲存結構,而且表種的元素是有序的。只有滿足這個條件我們才能使用二分查詢。查詢條件 查詢區域的左邊界,小於等於查詢區域的右邊界 查詢過程 1.迴圈條件 查詢條件 2.計算序列中間下標位置 3.如果待查詢...

二分查詢的應用

二分查詢是一種很有效率的查詢方式,每次查詢後餘下的區間是指數級遞減的。二分查詢的限制也很明顯,就是資料必須是拍過序的。首先我們來看通過二分查詢的方式來計算乙個數的平方根 def mysqrt n int,left int,right int,bit num float mid left right ...