用二分法查詢迴圈遞增序列 Python

2021-08-02 07:34:06 字數 1398 閱讀 2902

問題:

使用二分法在迴圈遞增序列中查詢指定元素,返回其下標;若不存在,則返回-1.要求時間複雜度為:o(logn)。

迴圈遞增序列的定義:

nums = [7,8,9,10,1,2,3,4,5,6]

即,乙個序列被分為兩個子串行,每個子串行都是遞增的,並且如果在指定位置(如「10」,「1」之間)切斷重組,則可以變為遞增序列。

思路:注意:由於時間複雜度要求為 o(logn),則不能使用先找到斷點的方法(若先找到斷點,則時間複雜度必然大於o(n))。

一、我們回想一下用二分法查詢遞增序列:

def fun0(nums,target):

start = 0

end = len(nums)-1

mid = (start+end)/2

while start<=end:

if target==nums[mid]:

return mid

if target

二、在處理迴圈遞增列表時,我們依舊將列表先切成兩段(每乙個矩形代表乙個遞增子串行),切完之後會產生a、b兩種情況:

a情況,斷點位於第乙個遞增子串行之中,則待查詢值target 可能位於上圖(1)區域,或者(2)區域;若target位於(1)區域中,則可以用二分法查詢;若不在,則對(2)繼續切割;

b情況,斷點位於第二子串行中,待查詢target可能位於(3)或(4);若target位於(4)區域,則用二分法;其餘情況同上。

總結:每次切割,都可以得到乙個遞增序列和乙個迴圈遞增序列,當發現target為遞增序列中時,則可以使用二分法查詢,否則,繼續切割迴圈遞增序列。

def fun(nums,target):

start = 0

end = len(nums)-1

while start<=end:

mid = (start+end)/2

if target==nums[mid]:

return mid

if nums[start]=nums[start] and target<=nums[mid]: #(1)區間

end = mid-1

else: #(2)區間

start = mid+1

if nums[mid]=nums[mid] and target<=nums[end]: #(4)區間

start = mid+1

else: #(3)區間

end = mid-1

return -1

nums = [7,8,9,10,1,2,3,4,5,6]

print fun(nums,4)

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

二分法查詢

前幾天csdn上說只有10 程式設計師能寫出正確的二分法查詢 so.我在看過二分法查詢方法後寫了乙個 一次測試成功.範圍 需要次數 10 4 100 7 1000 10 10000 14 100000 17 1000000 20 除了對特別小的陣列外,二分法查詢表現是非常優秀的.每次對範圍加倍可以建...