如何解决给定一个长度为 N 的整数排序列表,确定元素 x 是否在列表中
要解决的问题是:
给定一个长度为 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
解决方法
我们可以通过逐位构造索引来找到x
的索引是否存在:
def find_idx_sorted(arr,x):
powers_of_two = [1]
while powers_of_two[-1] < len(arr):
powers_of_two.append(powers_of_two[-1] + powers_of_two[-1])
idx = 0
for pot in reversed(powers_of_two):
if idx + pot < len(arr) and x >= arr[idx + pot]:
idx += pot
return idx
那么我们需要做的就是:
def contains_sorted(arr,x):
return arr[find_idx_sorted(arr,x)] == x
,
要使用 log2(N) 调用仅添加而不使用循环查找:
def find_pos(step,arr,val):
next = step+step
if next < len(arr):
choose = find_pos(next,val)
else:
choose = step
next = choose + step
if next < len(arr) and arr[next] <= val:
return next
if arr[choose] <= val:
return choose
return 0
def find_val(arr,val):
index = find_pos(1,val)
if arr[index] == val:
print "found %d at %d" % (val,index)
else:
print "%d not found" % (val)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。