對於任意給定的實數陣列,可以排序(從小到大排列)並實現任意目標的查詢,若目標不在陣列中,則返回其加入陣列但不改變排序的索引值。
新手一枚,不足之處,敬請讚之→ _ →
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 ...