演算法強化 二分查詢

2021-10-03 21:33:27 字數 2472 閱讀 7775

def

binarysearch

(self,nums,target)

: left =

0 right =

len(nums)-1

while

(left <= right)

: mid =

(right+left)/2

if nums[mid]

== target:

return mid

elif nums[mid]

left = mid+

1elif nums[mid]

>target:

right = mid-

1return

-1

因為初始化right的賦值是len(nums)-1 即最後乙個元素的索引 而不是len(nums)

這二者可能出現在不同功能的二分查詢中,區別是:前者相當於兩端都封閉區間[left,right],後者相當於左閉右開區間[left,right),因為索引大小為len(nums)是越界的

演算法中使用的是[left,right]兩端都閉的區間。這個區間就是每次進行搜尋的區間,我們不妨稱為[搜尋區間(search space)]

while(left <= right)的終止條件是 left ==right+1 , 寫成區間的形式就是[right+1,right],或者帶個具體的數字進去[3,2],這時搜尋區間為空,因為沒有數字即大於3又小於等於2,所以此時while迴圈終止,直接返回-1。

while(left < right)的終止條件是left == right ,寫成區間的形式就是[right,right],或者帶個具體的數字進去[2,2],這時搜尋空間費控,還有乙個數2,但是此時while迴圈終止,也就說區間[2,2]被漏掉了,索引2沒有被搜尋,如果這個時候直接返回-1,就可能出現錯誤。

通過搜尋區間的概念,本演算法的搜尋區間是兩端都封閉的,即[left,right]。那麼當我們發現索引mid 不是要找target時,如何確定下一步的搜尋區間

當然是去搜尋[left,mid-1]或者[mid+1,right],因為mid 已經搜尋過,應該從搜尋區間中去除掉。

計算中間點index middle = (lower+upper) // 2

對於python來說,這樣寫沒問題,因為python 直譯器幫我們處理了整數溢位問題,假如我們使用的是c語言,lower,upper可能都是32位整數,再假設,lower,upper都是大於2的16次方的整數,那麼二者的和就溢位了,所以我們採用最安全的寫法:

middle = lower+(upper—lower) // 2

取兩個整數的平均值有兩個不同的取法,一種是向上取整,一種是向下取整

向下取整 middle = lower + (upper - lower) // 2

向上取整 middle = lower + (upper - lower+1) // 2

例如:對3,5求平均值,無論是向上向下取整,結果都是4;但是對於3,4求均值,向上取整的話記過是4,向下取整的話是3

其實對於嚴格聖墟排序的資料,進行二分搜尋的時候,選取中間點,無論向上向下取整都是可以的。

但是對於含有重複元素的陣列,進行二分搜尋的時候,若是求開始位置,則必須使用向下取整,若是求結束位置,則必須使用向上取整。因為我們去的中間點的位置要盡可能的靠近需求取整的位置。

def

left_bound

(nums,target):if

len(nums)==0

:return-1

left =

0 right =

len(nums)

while

(left: mid =

(left+right)/2

if nums[mid]

== target:

right == mid

elif nums[mid]

left = mid +

1elif nums[mid]

>target:

right = mid

return left

def

right_bound

(nums,target):if

len(nums)==0

:return-1

left =

0 right =

len(nums)

while

(left: mid =

(left+right)/2

if nums[mid]

== target:

left == mid+

1elif nums[mid]

left = mid +

1elif nums[mid]

>target:

right = mid

return left-

1

查詢演算法 二分查詢

利用二分查詢演算法查詢某乙個元素,前提條件是該被查詢的元素是乙個已經有序的陣列。二分查詢的思想是將陣列元素的最高位 high 和最低位 low 進行標記,取陣列元素的中間 mid 和和要查詢的值 key 進行比較,如果目標值比中間值要大,則將最低位設定為mid 1,繼續進行查詢。如果目標值小於中間值...

查詢演算法 二分查詢

二分查詢的思路是很簡單的,前提是這組資料是有順序的。思路是從中間找乙個數,判斷大小,如果數比中間數大,說明在中間數到結尾的數中,如果小於,則說明在開始和中間數之間,經過多次相同操作,就可以得到我們想查詢的數時間複雜度就是 o logn 非遞迴的實現 const testarr let i 0whil...

查詢演算法 二分查詢

二分查詢是乙個常用的查詢演算法,其原理在於通過不斷切分乙個規則排序,對半的去尋找目標元素所在的區間與位置。但是其有乙個前提,那就是資料結構需要是順序儲存結構,並且關鍵字大小有序排列。例子如下 例 有乙個數列 12,23,45,56,67,89 請使用二分查詢找到56的位置 解 首先mid 0 5 2...