У меня небольшая задача улучшить бинарный поиск по умолчанию для всех.Как я описал в этом ответе: Как я могу упростить этот рабочий код бинарного поиска в C? ...
... почти все мои бинарные поиски ищут позиции вместо элементов, поскольку это быстрее и проще в правильном понимании.
Он также легко адаптируется к таким ситуациям:
def countBetweenXand2X(A,x):
if x<=0:
return 0
# find position of first element > x
minpos = 0
maxpos = len(A)
while minpos < maxpos:
testpos = minpos + (maxpos-minpos)//2
if A[testpos] > x:
maxpos = testpos
else:
minpos = testpos+1
start = minpos;
# find position of first element >= 2x
maxpos = len(A)
while minpos < maxpos:
testpos = minpos + (maxpos-minpos)//2
if A[testpos] >= x*2:
maxpos = testpos
else:
minpos = testpos+1
return minpos - start
Это всего лишь 2 бинарных поиска, поэтому сложность остается O (log N) .Также обратите внимание, что второй поиск начинается с позиции, найденной в первом поиске, поскольку мы знаем, что вторая позиция должна быть >=
первой.Мы достигаем этого, просто оставив minpos
в покое, вместо того, чтобы обнулять его.