【问题标题】:Binary Search implementation in PythonPython中的二分搜索实现
【发布时间】:2017-12-31 20:21:31
【问题描述】:

我正在尝试使用二进制搜索来实现解决方案。我有一个数字列表

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

但是当我尝试实现这一点时,我收到了一个错误,例如:索引超出范围。请帮助确定问题。

【问题讨论】:

  • 你为什么不返回任何东西?编辑:Nvm,你打印出来。
  • l2s 是什么?你的意思是list 吗? (另外,永远不要命名变量list...它隐藏了Python内置的list。)
  • 好的,知道了。它希望我在找到值的情况下返回一些东西。
  • 你似乎将l2slist 交织在一起...

标签: python-3.x binary-search


【解决方案1】:

一些事情。

  1. 您的命名不一致。另外,不要使用 list 作为变量名,你会隐藏全局内置函数。

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

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


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

【讨论】:

    【解决方案2】:

    更新 high = len(lst) - 1 下面每个 cmets。


    三个问题:

    1. 您使用了l2s 而不是list(参数的实际名称)。
    2. 您的while 条件应该是low &lt;= high,而不是low &lt; high
    3. 您应该在找到该值时返回索引,如果未找到,则返回 None(或者可能是 -1?)。

    我做了一些其他的小改动:

    • 隐藏内置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
    

    【讨论】:

    • 问题是因为我正在初始化 high = len(lst),但它应该是 high = len(lst) - 1。我读到初始化 mid = low + ( high-low)/2 防止溢出。
    • 你说得对,它应该是len(lst) - 1low + (high - low) / 2(low + high) / 2 相同。我只是简化了表达式。
    • 是的,它们是一样的,但是 (low + high)/2 会造成溢出,所以建议使用其他方法
    • 如果low + high 太大,您是在谈论整数溢出?这似乎是一个奇怪的问题,我相信在 Python 中完全不是问题。
    • 是的,假设 high=2^31 和 low=1,我尝试做 (high+low) 那么它会破坏代码。这与我的问题无关。我只是在浏览解决方案时阅读它。
    猜你喜欢
    • 2015-08-18
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多