【问题标题】:Infinite loop in binary search algorithm二分查找算法中的无限循环
【发布时间】:2022-01-03 18:09:39
【问题描述】:

我是算法的新手。我最近开始研究二进制搜索并尝试自己实现它。任务很简单:我们有一个整数数组a 和一个整数x。如果a 包含x,则结果应该是它的索引,否则函数应该返回-1

这是我写的代码:

def binary_search(a, x):
    l = 0
    r = len(a)
    while r - l > 0:
        m = (l + r) // 2
        if a[m] < x:
            l = m
        else:
            r = m
    if a[l] == x:
        return l
    return -1

但是这段代码在a = [1, 2]x = 2 上陷入无限循环。我想,我的循环条件不正确(可能应该是r - l &gt;= 0),但这个解决方案没有帮助。我哪里错了?

【问题讨论】:

标签: python algorithm binary-search


【解决方案1】:

让我做一些桌面检查。我假设a = [1, 2],我们正在寻找 2

所以我们开始

l = 0
r = 2

由于r - l = 2 &gt; 0,我们进入while循环。

m = (l + r) / 2 = (0 + 2) / 2 = 1
a[m] = a[1] = 2 == x  (hence not less than x)
r = m = 1 (and l remains the same)

现在r - l = 1 - 0 = 1 &gt; 0,我们继续

m = (l + r) / 2 = (0 + 1) / 2 = 0
a[m] = a[0] = 1 < x
l = m = 0 (and r remains the same)

在此迭代之后,rl 的值与之前相同,然后会产生无限循环。

Ashok 的回答是一个很好的解决方法。但我认为对固定代码进行一些桌面检查并看看有什么改进是很有教育意义的。

l + 1 = r 时,基本上出现问题的情况。 然后m 将始终评估为la[l] &lt; xl 再次设置为m,这不会改变这种情况。

在一段较大的代码中,创建一个表是有意义的,该表包含一个用于观察每个变量的列和一个用于记下评估的代码行的列。备注栏也不会有害。

【讨论】:

    【解决方案2】:

    正如 Mani 提到的,你没有考虑 A[m]==x 的时间。包括那个案例(那时你已经找到了a,所以只需返回m),一旦你有了那个案例,当我们仍然低于x时,我们可以让l=m+1。像这样:

    def binary_search(a, x):
        l = 0
        r = len(a)
        while r - l > 0:
            m = (l + r) // 2
            if a[m] < x:
                l = m + 1
            elif a[m]==x:
                return m
            else:
                r = m
        if l<len(a) and a[l] == x:
            return l
        return -1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 2016-06-18
      相关资源
      最近更新 更多