普通的二分查詢用於尋找排序陣列中的某個數的位置,但是如果陣列中該數存在很多個的話,可能就無法得到確定的位置。有時候你就可能需要從左或者從右的逼近。
def
wfind_num
(nums, target)
: high =
len(nums)
#因為需要邊界條件鑑別是否找到
low=
0while low < high:
mid =
(low + high)//2
if nums[mid]
<= target:
low = mid +
1else
: high = mid
return high -
1
前提:我們知道二分查詢時,mid 指標天然是向左縮排的,這是由於除法的性質,當high = low+ 1時,1 / 2是0。所以此時mid是等於low的,所以下一步要麼low = mid + 1 要麼 high = mid或者mid- 1,不然就出現了死迴圈。low 等於 mid, mid又等於low
就像下面這樣
while low < high:
mid =
(low + high)//2
if nums[mid]
<= target:
low = mid
else
: high = mid +
1
如果[2,3]中查詢2的位置則出現死迴圈,所以得避免出現死迴圈。
因為普通查詢是雙側逼近,而我們需要找到邊界點的位置只需要單側逼近即可
當mid位置的值等於target則往右邊進一位稱為從左往右逼近右邊界點。
當mid位置的值等於tatget則往左邊進一位稱為從右往左逼近左邊界點。
所以當我們需要左逼近時 只要去掉
if nums[mid]
<= target:
中的等號即可(mid天然向左逼近)
此時需要輸出begin / end
判斷是否找到
對比一下返回位置的數和target是否相同即可
因為 high = len(nums) 而不是len(nums)-1,可能出現查詢出的位置超過索引的情況
(右邊查詢會出現return-1,左邊會出現return len(nums)),靈活判斷一下即可
二分查詢法
二分查詢要求 1.必須採用順序儲存結構 2.必須按關鍵字大小有序排列。優缺點 折半查詢法的優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。演算法思想 首先,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者...
二分查詢法
有序陣列中的find 方法 public int find long serchkey int lowerbound 0 int upperbound nelems 1 while true curin lowerbound upperbound 2 if a curin serchkey retu...
二分查詢法
演算法基本思想 二分查詢演算法的前置條件是,乙個已經排序好的序列 假設這個序列是公升序排列的 這樣在查詢所要查詢的元素時,首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個元素,就在當前序列的前半部分繼續查詢,直到找到相同的元素,或者所查詢的序列範圍為空為止...