【问题标题】:In binary search, why is my loop infinite?在二进制搜索中,为什么我的循环是无限的?
【发布时间】:2018-12-22 04:18:47
【问题描述】:

我运行一个带有函数的 while 循环来检查变量 i 是否高于列表的 len。我把它放在那里作为停止循环的一种方式,但它没有检查它。由于它不会自行结束,因此我必须在其中放置一个返回 false 的 if 条件。

def binarySearch(numberlist, number):
    first = 0
    last = len(numberlist)-1
    found = False
    i=0

    while found == False or i <= len(numberlist):
        i = i + 1
        mid = (first + last) // 2
        print(numberlist[mid])
        if i > len(numberlist)+1:
            return False
        if mid < first or mid > last or mid < 0:
            return False
        if number == numberlist[mid] or number == numberlist[first] or number == numberlist[last] :
            return True
        elif number < numberlist[mid]:
            last = mid
        elif number > numberlist[mid]:
            first = mid
    return False

【问题讨论】:

标签: python-3.x algorithm binary-search


【解决方案1】:

错误在于以下几行。

elif number < numberlist[mid]:
    last = mid
elif number > numberlist[mid]:
    first = mid

考虑我们正在寻找一个不在列表中的数字的情况。

指针firstlastmid 最终都会收敛到某个索引。在这种情况下,最后两个条件之一将是True,但由于所有三个值都已经相等,指针不再更新,我们进入无限循环。

为了确保不会发生这种情况,我们必须通过将first 设置为mid + 1last 设置为mid - 1 来确保间隔始终减小,具体取决于条件.如果first 变得大于last,我们就可以停止循环。

def binary_search(numberlist, number):
    first, last = 0, len(numberlist) - 1

    while first <= last:
        mid = (first + last) // 2
        if numberlist[mid] == number:
            return True
        elif numberlist[mid] > number:
            last = mid - 1
        else:
            first = mid + 1

    return False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2021-10-22
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多