二分查詢的左右逼近法

2021-09-27 20:46:25 字數 1279 閱讀 9054

普通的二分查詢用於尋找排序陣列中的某個數的位置,但是如果陣列中該數存在很多個的話,可能就無法得到確定的位置。有時候你就可能需要從左或者從右的逼近。

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...

二分查詢法

演算法基本思想 二分查詢演算法的前置條件是,乙個已經排序好的序列 假設這個序列是公升序排列的 這樣在查詢所要查詢的元素時,首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個元素,就在當前序列的前半部分繼續查詢,直到找到相同的元素,或者所查詢的序列範圍為空為止...