【发布时间】:2021-02-14 20:56:50
【问题描述】:
要解决的问题是:
给定一个长度为 N 的排序整数列表,确定元素 x 是否在列表中,而不执行任何乘法、除法或位移操作。在 O(log N) 时间内完成此操作。
我已经使用修改后的二进制搜索解决了这个问题,但我不确定这是否满足所需的时间复杂度。有没有更好的解决方案?
def get_mid(start, end):
mid = start + 1
sum_ = start + end
prev = mid
while mid < end and (mid + mid) != sum_ and (mid + mid + 1) != sum_:
prev = mid
mid += mid
if mid > end:
return prev
return mid
def bin_search(arr, x):
start, end = 0, len(arr) - 1
while start <= end:
mid = get_mid(start, end)
if mid == 1:
return x in arr[:end]
if x > arr[mid]:
start = mid + 1
elif x < arr[mid]:
end = mid - 1
else:
return True
return False
【问题讨论】:
-
二分查找是 O(log n),这正是你应该使用的方法。
-
但我不确定如何在不除以 2 的情况下进行二分搜索。
-
如果您不确定是否存在问题,您可能还没有遇到 Stack Overflow 问题......您认为实现的哪一部分是不是 O(n log n),为什么?
-
@Prune 我想可能是
get_mid()中的while循环,需要满足禁止除法的要求。 -
@Prune 是的,正如 Barma 所说.. 我还搜索了任何想法进行除以 2 而不进行除法,我发现只有减法方法需要 O(num),这不是一个好的选择对于问题..
标签: python algorithm data-structures binary-search sortedlist