调试二进制搜索

时间:2019-03-13 17:09:47

标签: python algorithm python-2.7 binary-search

下面是二进制搜索的实现,但是它有些问题。找到它并通过修改一行来解决!

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吧?所以这里没问题...

感谢所有帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

错误还进一步!

buildChildrenNodes() {
    let arrayOneStrings: Array<object> = [];
    this.treedata.map((element: any) => {
        const sortedData = Object.entries(element);
        let arrayTwoStrings: Array<object> = [];
        for (const [key, value] of sortedData) {
            const twoElement =
            {
                name: key,
                children: [
                    {
                        name: value
                    }
                ]
            }
            arrayTwoStrings.push(twoElement);
        }
        const oneElement = {
            name: element.id,
            children: arrayTwoStrings
        };
        arrayOneStrings.push(oneElement);
    });
    this.formattedTreeData = arrayOneStrings;
};

如果if high < low: #ERROR IS HERE return -1 不在value中,这将导致无限递归。

原因:

array的值将从不低于high的值。这是因为更改这些值的唯一方法是在递归调用中用low替换它们。从mid开始,它们最终将同时成为mid=(high+low)//20。并且由于high(0+0)//2 == 0,您将最终进行无限递归,直到堆栈崩溃为止。因此,您的修复程序似乎很简单(high+high)//2 == high

现在出现了一个新问题:

如果我们在if high <= low:high处寻找值怎么办?然后我们将得到-1,因为两个值都相同。解决方案使0语句更加精确:

if

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