Python 3.x 二进制搜索在Python中的实现

Python 3.x 二进制搜索在Python中的实现,python-3.x,binary-search,Python 3.x,Binary Search,我正在尝试使用二进制搜索实现一个解决方案。我有一张号码表 list = [1, 2, 3, 4, 6] value to be searched = 2 我写过这样的东西 def searchBinary(list, sval): low = 0 high = len(list) while low < high: mid = low + math.floor((high - low) / 2) if list[mid] ==

我正在尝试使用二进制搜索实现一个解决方案。我有一张号码表

list = [1, 2, 3, 4, 6]
value to be searched = 2
我写过这样的东西

def searchBinary(list, sval):
    low = 0
    high = len(list)

    while low < high:
        mid = low + math.floor((high - low) / 2)

        if list[mid] == sval:
            print("found : ", sval)
        elif l2s[mid] > sval:
            high = mid - 1
        else:
            low = mid + 1
def searchBinary(列表,sval):
低=0
高=长(列表)
低<高:
中=低+数学楼层((高-低)/2)
如果列表[mid]==sval:
打印(“找到:”,sval)
elif l2s[mid]>sval:
高=中-1
其他:
低=中+1
但当我试图实现这个时,我得到了一个错误,比如:索引超出范围。请帮助确定问题。

一些事情

  • 你的名字不一致。另外,不要使用
    list
    作为变量名,这是在隐藏全局内置项

  • 停止条件是
    ,而低一些事情

  • 你的名字不一致。另外,不要使用
    list
    作为变量名,这是在隐藏全局内置项


  • 根据下面的注释,停止条件为
    ,而低更新
    high=len(lst)-1


    三个问题:

  • 您使用了
    l2s
    而不是
    list
    (参数的实际名称)

  • 您的
    while
    状态应为
    low根据下面的注释更新
    high=len(lst)-1


    三个问题:

  • 您使用了
    l2s
    而不是
    list
    (参数的实际名称)

  • 您的
    while
    条件应该是
    低,为什么不返回任何内容?编辑:Nvm,你把它打印出来。什么是l2s?你是说那里有
    列表
    ?(另外,永远不要命名变量
    list
    …它隐藏了Python内置的
    list
    )好的,明白了。它希望我在找到值的情况下返回一些内容。您似乎将
    l2s
    list
    …为什么不返回任何内容?编辑:Nvm,你把它打印出来。什么是l2s?你是说那里有
    列表
    ?(另外,永远不要命名变量
    list
    …它隐藏了Python内置的
    list
    )好的,明白了。它希望我在找到值时返回一些内容。您似乎将
    l2s
    list
    交错…问题是因为我初始化了high=len(lst),但它应该是high=len(lst)-1。我还了解到,初始化mid=low+(high-low)/2以防止溢出是一种很好的做法。您认为它应该是
    len(lst)-1
    <代码>低+(高-低)/2
    (低+高)/2
    相同。我只是简化了表达式。是的,它们是相同的,但是(低+高)/2会产生溢出,所以建议使用其他方法。如果
    low+high
    太大,你说的是整数溢出?这似乎是一个奇怪的问题,我相信Python中完全没有问题。是的,假设high=2^31,low=1,我尝试(high+low),那么它将破坏代码。这与我的问题无关。我只是在浏览解决方案时阅读了它。问题是因为我初始化了high=len(lst),但它应该是high=len(lst)-1。我还了解到,初始化mid=low+(high-low)/2以防止溢出是一种很好的做法。您认为它应该是
    len(lst)-1
    <代码>低+(高-低)/2
  • (低+高)/2
    相同。我只是简化了表达式。是的,它们是相同的,但是(低+高)/2会产生溢出,所以建议使用其他方法。如果
    low+high
    太大,你说的是整数溢出?这似乎是一个奇怪的问题,我相信Python中完全没有问题。是的,假设high=2^31,low=1,我尝试(high+low),那么它将破坏代码。这与我的问题无关。我只是在浏览解决方案时阅读它。
    def searchBinary(l2s, sval): # do not use 'list' as a variable
        low = 0
        high = len(l2s) 
    
        while low <= high: # this is the main issue. As long as low is not greater than high, the while loop must run
            mid = (high + low) // 2
    
            if l2s[mid] == sval:
                print("found : ", sval)
                return
            elif l2s[mid] > sval:
                high = mid - 1
            else:
                low = mid + 1
    
    list_ = [1, 2, 3, 4, 6]
    searchBinary(list_, 2)
    
    found :  2
    
    def binary_search(lst, sval):
        low = 0
        high = len(lst) - 1
    
        while low <= high:
            mid = (low + high) // 2
    
            if lst[mid] == sval:
                return mid
            elif lst[mid] > sval:
                high = mid - 1
            else:
                low = mid + 1
    
        return None
    
    print(binary_search([1, 2, 3, 4, 6], 2))  # 1