Предполагается, что этот алгоритм равен O(logn)
, но не с точки зрения реализации.
В вашем алгоритме вы не принимаете решение о переходе на левый или правый подмассив.только вы пытаетесь использовать оба подмассива: O(N)
.
Вы делаете нарезку на массиве a[low:mid]
и a[mid + 1:]
, что составляет O(n)
.
Что делает вашу общую сложность O(n^2)
в худшем случае.
Если предположить, что в массиве нет дубликатов, идеальная реализация в Python 3 двоичного поиска O(logn)
выглядит следующим образомэто -
A=[15,16,19,20,25,1,3,4,5,7,10,14]
low = 0
hi = len(A) - 1
def findindex(A, low, hi, target):
if low > hi:
return -1
mid = round((hi + low) / 2.0)
if A[mid] == target:
return mid
if A[mid] >= A[low]:
if target < A[mid] and target >= A[low]:
return findindex(A, low, mid - 1, target)
else :
return findindex(A, mid + 1, hi, target)
if A[mid] < A[low]:
if target < A[mid] or target >= A[low]:
return findindex(A, low, mid - 1, target)
else :
return findindex(A, mid + 1, hi, target)
return -1
print(findindex(A, low, hi, 3))