使用二进制搜索查找上限和下限值

时间:2015-10-07 21:00:52

标签: python algorithm

这是二进制搜索的代码,想知道是否没有匹配值,问题是上限应该位于小或小+ 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

2 个答案:

答案 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>