Python中的二进制搜索实现

时间:2017-07-25 18:41:17

标签: 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] == sval:
            print("found : ", sval)
        elif l2s[mid] > sval:
            high = mid - 1
        else:
            low = mid + 1

但是当我尝试实现这个时,我收到的错误如下:index超出范围。请帮助确定问题。

2 个答案:

答案 0 :(得分:2)

一些事情。

  1. 您的命名不一致。另外,不要使用list作为变量名称,而是要遮蔽全局内置函数。

  2. 停止条件为while low <= high。这个很重要。

  3. 找到值时不会中断。这将导致无限递归。

  4. 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
    

答案 1 :(得分:1)

每条评论

更新 high = len(lst) - 1

三个问题:

  1. 您使用l2s代替list(参数的实际名称)。
  2. 您的while条件应为low <= high,而不是low < high
  3. 您应该在找到值时返回索引,或者如果找不到则None(或者可能是-1?)。
  4. 我做了其他一些小改动:

    • 隐藏内置list是一个坏主意。我将参数重命名为lst,这种情况在Python中常用。
    • mid = (low + high) // 2是找到中点的简单形式。
    • Python约定是使用snake_case,而不是camelCase,所以我重命名了函数。

    固定代码:

    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