Python 二分法遞迴查詢列表 v2 0

2021-10-07 22:31:07 字數 3684 閱讀 6647

二分法適合在閉區間中查詢,所以本文排除了目標超出數值範圍的情況,至於目標在列表中有對應元素的情況,用內建函式會方便很多,所以本文主要是針對目標在陣列間隙位置的情況,利用二分法進行查詢,具體來說:

若目標在陣列中,直接返回其索引(若目標對應元素有重複,則返回相同元素位置範圍);

若目標超出了列表數值範圍,返回0,或者陣列長度;

若目標在陣列間隙位置,則返回其加入陣列但不改變陣列排序的索引值。

ps:新手一枚,不足之處,敬請讚之→ _ →

1)簡單說二分查詢就是乙個切片查詢的過程,通過對比目標(t)和中點值(m)[0]的大小決定是下一級查詢是向左還是向右。

如:原陣列[a,b, …,m,c,…,d],若 t > m, 則在下級陣列[m,c, … ,d]中繼續找中點m1,若 t < m, 則在下級陣列[a,b, …,m]中繼續找中點m1,如此反覆,直到中點和端點相鄰,就可以確定目標位置。

[0]:中點索引通過陣列的端點(left和right)索引之和除以2取整獲得:

m=(left+right)//2

2)具體程式如下,函式版簡單粗暴直接上二分查詢,完整版最初是因為陣列排序和右端點初始值的獲取只需一次,而查詢需要迭代,兩者矛盾,所以就引入了類,發現效果好像不是很好,簡單程式還是直接使用函式方便,這次權當是類的演練吧。除了上面提到的初始化問題,結合文章開頭的分析於是就有了完整版。

函式版:

def

search

(thelist, target, right, left=0)

: mid_index =

(left + right)

//2

mid_value = thelist[mid_index]

if target == mid_value:

return mid_index

if target < mid_value:

if mid_index - left <=1:

if target < thelist[left]

: result = left

else

: result = left +

1return result

else

: right = mid_index

return gap_search(thelist, target, right)

elif target > mid_value:

if right - mid_index <=1:

if target > thelist[right]

: result = right +

1else

: result = right

return result

else

: left = mid_index

return gap_search(thelist, target, right, left)

if right < left:

return

none

完整版:

class

binarysearch()

:def

__init__

(self, thelist, target)

: self.thelist = thelist

self.target = target

self.left =

0def

search

(self)

: self.thelist.sort(

)try

: result = self.thelist.index(self.target)

count =

0if result !=

len(self.thelist)-1

:while self.thelist[result +1]

== self.target:

result +=

1 count +=

1if count:

result =

(result - count, result)

return result

except valueerror:

if self.target <

min(self.thelist)

:return

0elif self.target >

max(self.thelist)

: result =

len(self.thelist)

return result

else

: self.right =

len(self.thelist)-1

return self.gap_search(

)def

gap_search

(self)

: mid_index =

(self.left + self.right)

//2

mid_value = self.thelist[mid_index]

if self.target < mid_value:

if mid_index - self.left <=1:

if self.target < self.thelist[self.left]

: result = self.left

else

: result = self.left +

1return result

else

: self.right = mid_index

return self.gap_search(

)elif self.target > mid_value:

if self.right - mid_index <=1:

if self.target > self.thelist[self.right]

: result = self.right +

1else

: result = self.right

return result

else

: self.left = mid_index

return self.gap_search(

)if self.right < self.left:

return

none

函式版查詢需要:1,列表順序排列,2,提供列表右端索引,舉栗如下:

nums=[5

,6,8

,90,7

,1,86

,31,6

,9]target =

80nums.sort(

)right =

len(nums)-1

result = search(nums,target,right)

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...

遞迴二分法查詢

二分法使用了折半查詢的思想,不斷的變化,陣列下標的起始位置 begin 和終止位置 end 來進行搜尋。我們使用兩種演算法,解決二分查詢 public class solution system.out.println solution.sort number,0,number.length,56 ...