二分法適合在閉區間中查詢,所以本文排除了目標超出數值範圍的情況,至於目標在列表中有對應元素的情況,用內建函式會方便很多,所以本文主要是針對目標在陣列間隙位置的情況,利用二分法進行查詢,具體來說:
若目標在陣列中,直接返回其索引(若目標對應元素有重複,則返回相同元素位置範圍);
若目標超出了列表數值範圍,返回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 ...