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

2021-10-07 10:09:42 字數 1632 閱讀 2346

對於任意給定的實數陣列,可以排序(從小到大排列)並實現任意目標的查詢,若目標不在陣列中,則返回其加入陣列但不改變排序的索引值。

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

1.簡單說二分查詢就是乙個切片查詢的過程,通過對比目標(t)和中點值(m)[0]的大小決定是下一級查詢是向左還是向右。例如:原陣列[a,b, …, m-1,m,m+1,c,…,d],若t>m,則在1級陣列[m+1,c, … ,d]中繼續找中點,比大小,定左右,如此遞迴(為加快搜尋進度,這裡捨棄了中點值)。

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

m=int((left+right)/2)

2.一般可以定位目標的切片長度(l)為1或2:

l=1,的上級切片長度為3,形如:[a,b,c],此時m=b,對比t和b的大小,切片即剩下[a]或[b];

l=2,的切片形如:[a,b],此時m=a,此時t可以在3個位置,若ta=m, left=m+1=b=right, 下級切片長度為1,t=m

若t>b,則t>a=m,left=m+1=b=right,下級切片長度為1,t=m+1。

3.綜上,結束遞迴的條件可以分為3類:

1、t=m,返回中點索引;

2、切片長度為±1,通過比較t和m,返回中點索引或中點索引+1;

3、遞迴出錯,返回none(因為當切片長度為-1時,l=r+1=m+1,若遞迴繼續將進入死迴圈)。

由於切片操作會改變原陣列,所以文章通過改變端點索引來定位中點索引,並且將中點索引對應的值命名為中點值[1]。

def

binary_search

(thelist, target, right, left=0)

:'''binary search'''

mid_index =

int(

(left + right)/2

) mid_value = thelist[mid_index]

if left >= right:

if target > mid_value:

return mid_index+

1else

:return mid_index

if target == mid_value:

return mid_index

elif target < mid_value:

return binary_search(thelist, target, right=mid_index-1)

else

:return binary_search(thelist, target, right, left=mid_index+

1)

(1)查詢需要列表順序排列,並初始化列表右端索引,如:

nums=[5

,6,8

,90,7

,1,86

,31,6

,9]target =

80nums.sort(

)right =

len(nums)-1

result = binary_search(nums,target,right)

(2)遞迴錯誤的條件設定待定。

(3)若列表中有重複元素,返回內容待定。

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