猜數字遊戲
給定乙個整數,在 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,資料很大的情況下直接相加可能導致資料溢位。
在得到下乙個查詢區間時,low
和high
的取值不能直接等於中間值,否則會導致死迴圈。
例如:當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
2nn
4\frac
4nn
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...