二分查詢的主要思路跟我們日常查字典思路是一樣(字典的單詞已經排好序):
1、先把字典翻開從中間劈成兩部分,看看要查的單詞在哪一部分,把它拿出來;
2、再把拿出來的那部分繼續均勻劈成兩半,再看看要查的單詞在哪部分;
3、再把單詞可能存在的那部分繼續均勻劈成兩半,如此迴圈反覆,字典越劈越少。。。
很快就能找到要查的單詞的那一頁,這就是二分查詢,速度很快,就是有點費字典。
實操案例:假如你是公司的管理人員,每天都在統計當天的營業額並進行累加,到月末最後一天累加的營業額就是當月的總營業額。假如月底你發現自己手工統計的累計額月營業額跟系統顯示的對不上,於是,你決定查詢究竟是哪一天統計資料對不上,這個時候就可以用上二分查詢(因為累計的營業額是公升序的):
1、先從月中的15號開始,如果資料無誤,那麼問題肯定出現在16~31號之間;
2、取16~31號中間的23號核對,發現資料有誤,那麼肯定是在16~23號之間出現問題;
3、取16~23號中間的日期19號進行核對,發現資料無誤,那麼肯定是在20~23號之間出現問題;
4、現在再取21或22號的日期再核對,很快就能找到出問題那一天。
以上都是簡單的思路和應用。
下面是julia**實現:
1function binary_search(arr, key)
2 lo, hi = 1, length(arr)34
while lo <=hi
5 mid = lo + (hi - lo) ÷ 2
6if key 7 hi = mid - 1
8 elseif key >arr[mid]
9 lo = mid + 1
10else
11return
mid12
end13
end14
return -1
15end
1617
function test()
18 arr = ["
abc", "
def", "
hij", "
klm", "
nop", "
qrs", "
tuv"
]19 println(binary_search(arr, "
nop"
))20 println(binary_search(arr, "
kkk"
))21
22 arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
23 println(binary_search(arr2, 1.2))
24end
2526 test()
注意第五行的除號是julia的整除。
執行結果如下:
5-1-1
二分查詢 Java版
演算法思想 又叫折半查詢,要求待查詢的序列有序。每次取中間位置的值與待查關鍵字比較,如果中間位置的值比待查關鍵字大,則在前半部分迴圈這個查詢的過程,如果中間位置的值比待查關鍵字小,則在後半部分迴圈這個查詢的過程。直到查詢到了為止,否則序列中沒有待查的關鍵字。三種查詢方法的比較 平均效能 斐波那契 折...
二分查詢 Java版
二分查詢 二分查詢又稱折半查詢,它是一種效率較高的查詢方法 實現原理 通俗點來講就是將要查詢部分對折,然後分為三部分 中間部分,中間前的部分,中間後的部分,將要查詢的和中間部分進行比較,如果小於中間部分則在中間部分的前面找,否則就在中間部分的後邊找,然後再重複上邊折半的過程 使用要求或者前提 通過實...
二分查詢終極版
本人最近懶癌發作,部落格已經幾個月沒動了,突然良心發現自己二分理解的不好,萬一要去省賽豈不是要收到來自大神的嘲諷?二分分為四種,嚴格大於某值的最小值 嚴格小於某值的最大值 大於等於某值的最小值 小於等於某值的最大值 我們需要關注三個地方 1.迴圈的條件 low 2.改變邊界的方法及條件 滿足要求條件...