問題:
使用二分法在迴圈遞增序列中查詢指定元素,返回其下標;若不存在,則返回-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 除了對特別小的陣列外,二分法查詢表現是非常優秀的.每次對範圍加倍可以建...