【问题标题】:Debugging Binary Search调试二分查找
【发布时间】:2019-03-14 02:36:24
【问题描述】:

下面是二分查找的一个实现,但它有问题。找到它,修改一行就修复它!

def binary_search(array, value, low, high):
    if high < low:
        return -1
    else:
        mid = (low + high)/2;
        if array[mid] > value:
            return binary_search(array, value, low, mid)
        elif array[mid] < value:
            return binary_search(array, value, mid+1, high)
        else:
            return mid
array = []
for i in xrange(10000):
    array.append(input())
for i in xrange(10000):
    value = input()
    answer = binary_search(array, value, 0, 9999)
    print("%d" % answer)

输入:

输入由长度为 10,000 的排序数组组成,后跟 10,000 个查询。每个整数都在自己的行中给出(总共有 20,000 行)。

保证数组中没有重复。

输出:

对于每个查询值,输出一行包含单个整数的输出:与查询值匹配的索引,如果值不在数组中,则为 -1。


我已经尝试修复这段代码好几天了……我很确定 if 子句中的递归参数是错误的。不应该是:

if array[mid] > value:
            return binary_search(array, value, low, mid-1)

因为否则,如果数组中只有一个元素并且元素 > 值,那么它将无限循环。但是根据评估员的说法,生成的代码仍然标记为错误答案!

其他嫌疑人:

  1. ';'在mid = (low + high)/2; 虽然不和谐,但它仍然编译得很好
  2. (low + high)/2 因为这是用 python 2.7 编写的,所以它相当于 python 3 中的(low + high)//2 对吧?所以这里没问题...

感谢所有类型的帮助。谢谢。

【问题讨论】:

    标签: python algorithm python-2.7 binary-search


    【解决方案1】:

    错误有点远!

    if high < low: #ERROR IS HERE
        return -1
    

    如果value 不在array 中,这将导致无限递归。

    推理:

    high 的值永远不会低于low 的值。这是因为更改这些值的唯一方法是在递归调用中用mid 替换它们。由于mid=(high+low)//2,最终它们将同时成为0high。因为(0+0)//2 == 0(high+high)//2 == high 你最终会进行无限递归,直到堆栈崩溃。因此,您的修复看起来像一个简单的if high &lt;= low:

    现在出现了一个新问题:

    如果我们在high0 寻找值怎么办?然后我们会得到-1,因为值都是相同的。解决办法,让if语句更精确:

    if high &lt;= low and array[(low+high)//2] != value:

    此代码确保如果第一个条件成立,我们还确保中间元素实际上不是我们正在寻找的值。

    【讨论】:

    • 感谢您非常彻底地回答。但是,此更正给出了“更改了太多代码:只应更改一行,而不应更改太多(最大距离 = 30)”。我开始认为评估器有问题!
    • @RawrDamn 嗯,我的意思是它确实是我能找到的唯一错误。如果没有附加语句,代码仍然会失败。您是否也尝试了我首先提供的错误解决方案?使用什么评估器?它是使用预定义的示例检查功能,还是对其进行静态推理等其他分析?
    • 该死的,我觉得自己很愚蠢。我修改了代码以将输出写入文件以使其更易于提交。认为它在最后一行留下换行符,这使其评估为错误答案。谢谢!接受的更正是:return binary_search(array, value, low, mid-1)
    • @RawrDamn 是的,我刚刚意识到这也有效。因为那时您实际上将高变量和低变量更改了 1。它本质上是同一问题的不同解决方案。评估员在新线路上出现这样的错误是令人担忧的,绝对不是你的错。
    猜你喜欢
    • 2010-10-25
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2021-03-07
    • 2012-12-24
    • 2015-07-25
    相关资源
    最近更新 更多