二分查詢的原理 實現與應用

2021-09-02 05:26:57 字數 2874 閱讀 3109

猜數字遊戲

給定乙個整數,在 0~100 的範圍內,如何猜才能用最少次數猜中?

次數猜測範圍

中間數對比大小

第一次0-99

4949>20

第二次0-48

2424>20

第三次0-23

1717<20

第四次18-2320✔

我們可以通過計算得到,猜 0-100 的整數,最多猜測 log2

100 次,也就是 7 次內必中。

觀察log函式圖形可知,資料量極大的情況下,猜測次數依舊不會很大,例如,當我們需要猜的數字在0~4,294,967,296之間,通過計算可知,最多猜測32次猜中。

迴圈實現二分查詢

public

intbsearch

(int

a,int n,

int value)

else

if(a[mid]

< value)

else

}return-1

;}

要寫出正確的二分查詢**,需要格外注意以下要點:

迴圈結束條件必定為low <= high在取中間值時,最好不要直接相加除 2,資料很大的情況下直接相加可能導致資料溢位。

在得到下乙個查詢區間時,lowhigh的取值不能直接等於中間值,否則會導致死迴圈。

例如:當low=3.high=3,array[3]!=value時

遞迴實現

// 二分查詢的遞迴實現

public

intbsearch

(int

a,int n,

int val)

private

intbsearchinternally

(int

a,int low,

int high,

int value)

else

if(a[mid]

< value)

else

}

第一次

第二次第三次

第四次……

第k次n

n

2\frac

2n​n

4\frac

4n​n

8\frac

8n​……

n 2k

\frac

2kn​

根據**可得,k=log2

n,即時間複雜度為o(log n)

二分查詢需要能夠快速定位區間位置,即隨機訪問複雜度必須為 o(1),依賴順序表,鍊錶則不行。

只針對有序資料,並且最好是靜態資料,沒有頻繁的插入的動態資料,可以一次排序,多次查詢。

資料量極小時,不適合二分查詢。

資料量過大也不適合二分查詢,因為二分查詢依賴順序表,資料過大無法載入到記憶體中。

資料均以正序排序

查詢第乙個值等於給定值的元素

思路一:

①進行二分分割槽,凡是中間數大於等於給定值,則所求元素在左邊,反之在右邊。

②二分結束,得到 low 位置為第乙個大於等於給定值的元素。

③判斷 low 位置是否在資料範圍內,該位置的值是否為給定值。

思路二:

①二分分割槽,三種情況:中間數大於、小於、等於給定值

②當等於給定值時,判斷中間數是否為第乙個數,再判斷中間數前乙個數是否等於給定值。

//**一

public

intbsearch

(int

a,int n,

int value)

else}if

(low < n && a[low]

==value)

return low;

else

return-1

;}

public

intbsearch

(int

a,int n,

int value)

else

if(a[mid]

< value)

else

}return-1

;}

查詢最後乙個值等於給定值的元素
public

intbsearch

(int

a,int n,

int value)

else

if(a[mid]

< value)

else

}return-1

;}

查詢第乙個大於等於給定值的元素
public

intbsearch

(int

a,int n,

int value)

else

if(a[mid]

< value)

}return-1

;

查詢最後乙個小於等於給定值的元素
public

intbsearch7

(int

a,int n,

int value)

else

}return-1

;}

二分查詢適合近似查詢,例如開平方,查詢第乙個小於給定值等。

查詢給定值等問題通常使用雜湊表實現。

二分查詢的應用

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

二分查詢的應用

最大的最小值,最小的最大值用二分 這個發現緣起於兩段看似相同的 這兩段 看似相同,實則大有學問 我編了乙個簡單的題目 在1,2,3,三個數中找到大於等於2的最小值 這是乙個求最小的最大值的問題,按道理來我們要用左開右閉的區間 及靠上方的 去逼近答案 若用靠下方的 左閉右開的區間 則步驟如下 1 l ...

二分查詢演算法的實現與原理解析

二分查詢演算法的前提 陣列必須是有序陣列 二分查詢演算法思路分析 遞迴版 如果 mid findval 查詢到目標值,返回即可 編寫二分查詢演算法 1.查詢到目標值就返回 注意 使用二分查詢的前提是 該陣列是有序的.public class binarysearch int resindex bin...