下面是二进制搜索的实现,但是它有些问题。找到它并通过修改一行来解决!
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)
否则,如果数组中只有一个元素,而元素>值,则它将无限循环。但是根据评估者,结果代码仍被标记为错误答案!
其他嫌疑犯:
mid = (low + high)/2;
中
尽管震撼,但仍然可以正常编译(low + high)/2
因为这是用python 2.7编写的,所以它等效于python 3中的(low + high)//2
吧?所以这里没问题... 感谢所有帮助。谢谢。
答案 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)//2
或0
。并且由于high
和(0+0)//2 == 0
,您将最终进行无限递归,直到堆栈崩溃为止。因此,您的修复程序似乎很简单(high+high)//2 == high
。
现在出现了一个新问题:
如果我们在if high <= low:
或high
处寻找值怎么办?然后我们将得到-1,因为两个值都相同。解决方案使0
语句更加精确:
if
此代码确保如果第一个条件成立,我们还确保中间元素实际上不是我们要查找的值。