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

Python 使用二进制搜索查找上限值和下限值,python,algorithm,Python,Algorithm,这是二进制搜索的代码,想知道是否没有匹配值,问题是上界应该定位在small或small+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 )

这是二进制搜索的代码,想知道是否没有匹配值,问题是上界应该定位在small或small+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
def二进制搜索(我的列表,键):
断言我的列表==已排序(我的列表)
大=len(我的列表)-1
小=0
while(小键:
大=中-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]);
lower=(我的列表[mid]键?我的列表[mid]:我的列表[mid+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)

因为查找时,
small
会在
键的索引上方结束,下限是
small-1
,上限是
small

,那么…问题是什么呢?@Paul,谢谢你的评论,我只是编辑了我的问题,以便更清楚地了解我的问题。:)嗨,Paul,为什么不检查mid+1?噢,sry,我应该在发布之前仔细阅读答案。我会纠正的嗨,保罗,那么我的方法有什么问题?上限应位于small或small+1,下限应位于small或small-1?谢谢,布伦特,非常感谢。想知道我的方法有什么问题吗?上限应位于small或small+1,下限应位于small或small-1?谢谢。嗨,布伦特,我想在最后一步中找到的价值可能比小的要大?假设在最后一步中,small和large与mid相等,value>mid(或small或large),但是value应该小于mid+1,因为我们从mid+1开始移动?如果我错了,请随时纠正我。:)当
my_list[mid]
时,small超出了列表的末尾,从而终止了while循环。嗨,布伦特,(small-1,small)的想法非常聪明和优雅,我喜欢它。标记为已回答。祝您今天过得愉快。
return (small-1, small)