这是二进制搜索的代码,想知道是否没有匹配值,问题是上限应该位于小或小+ 1?下限应位于小或小1,对吗?感谢。
def binary_search(my_list, key):
assert my_list == sorted(my_list)
large = len(my_list) -1
small = 0
while (small <= large):
mid = (small + large) // 2 )
# print small, mid, large, " - ", my_list[mid], "~", key
if my_list[mid] < key:
small = mid + 1
elif my_list[mid] > key:
large = mid - 1
else:
return mid
raise ValueError
答案 0 :(得分:1)
简单。您必须考虑到这样一个事实:算法可能会从左侧(较低值)或右侧(较高值)近似搜索项目的位置,这在退出后无法确定。 while
- 环。因此,您必须检查mid
的值是否小于或大于密钥:
lower = (my_list[mid] < key ? my_list[mid] : my_list[mid - 1]);
upper = (my_list[mid] > key ? my_list[mid] : my_list[mid + 1]);
答案 1 :(得分:1)
@Paul已关闭,它应返回mid+1
作为上限值。而不是引发异常,这里是Python中的代码,它将返回较低和较高的值:
value = my_list[mid]
lower = mid if value < key else mid-1
upper = mid if value > key else mid+1
return (lower, upper)
这是一个更简单的答案:
return (small-1, small)
由于small
在您查找时最终高于key
的索引,因此下限为small-1
,上限为small
。< / p>