根據中位數與旋轉點相對位置查詢
切分陣列查詢
給定乙個沒有重複元素的旋轉陣列(它對應的原陣列是有序的),求給定元素在旋轉陣列內的下標(不存在的返回-1),時間複雜度為logn。
如[4,5,6,7,0,1,2]就是乙個旋轉陣列:
從中位數與旋轉點的相對位置看,可以有:
def searchinshiftarray(ary:list, ele:int)->int:
def bisearch(ary, start, end):
if start>end:
return -1
mid = (start+end)//2
if ary[mid] == ele:
return mid
if ary[mid]>ele:
return bisearch(ary, start, mid-1)
else:
return bisearch(ary, mid+1, end)
def search(ary, start, end):
if start>end:
return -1
mid = (start+end)//2
if ary[mid] == ele:
return mid
if ary[mid]ary[mid]: # mid在旋轉點後,
if ary[end]>=ele:
return bisearch(ary, mid+1, end)
return search(ary, start, mid-1)
# mid在旋轉點前
return search(ary, mid+1, end)
else: # ary[mid]>ele
if ary[start]>ary[mid]: # mid在旋轉點後,
return search(ary, start, mid-1)
# mid在旋轉點前
if ary[start]<=ele:
return bisearch(ary, start, mid-1)
return search(ary, mid+1, end)
return search(ary, 0, len(ary)-1)
查詢有序陣列最方便的方式是二分查詢,而旋轉陣列也可以看作是由『旋轉點』(陣列中最小元素)切分的兩個有序陣列。可先找到旋轉點,然後分別在兩個有序陣列中查詢即可。
查詢旋轉點:
def findpivotpoint(ary:list)->tuple:
if ary[0]ary[end]:
return findpoint(ary, mid+1, end)
else: #
if ary[mid]return mid
else:
return findpoint(ary, start, mid-1)
index = findpoint(ary, 0, len(ary)-1)
return (true, index, ary[index])
有序陣列中二分法查詢
二分法查詢適用於資料量較大時,但是資料需要先排好順序。首先,從陣列的中間元素開始搜尋,如果該元素正好是目標元素,則搜尋過程結束,否則執行下一步。如果目標元素大於 小於中間元素,則在陣列大於 小於中間元素的那一半區域查詢,然後重複步驟1的操作。如果某一步陣列為空,則表示找不到目標元素。時間複雜度為 o...
二分查詢有序陣列
對於乙個有序字串陣列,用二分法查詢某一字串是否存在於該字串陣列中。函式原型為 bool binarysearch const vector array,const string target 注意這裡的有序指的是字典序,如字串陣列 a,ab,ac,bc,cd,d 就是有序字串陣列,而 a,b,ab ...
有序陣列的二分查詢
給出乙個有序陣列 公升序 以及指定的數值。返回指定數值在陣列中的下標 若不存在則返回 1 在傳入的公升序陣列arr中查詢是否有元素值與給定的number相等。param arr 有序陣列 公升序 param number 指定的數值 return 指定數值在該陣列中的下標值。返回 1表示不存在 st...