我创建了一个二分搜索,但我遇到了问题。每当我运行main()时,当key等于8,5,2和1时,我只得到None。我也试图让bsearch返回integer_list中key_point值的索引,但它只返回key_point。如果有人能让我知道出了什么问题,我会很感激。
def bsearch(integer_list, key_point, start, end):
midpoint = (start + end) // 2
if start >= end:
return None
elif integer_list[midpoint] == key_point:
return key_point
elif integer_list[midpoint] > key_point:
return bsearch(integer_list, key_point, start, (midpoint - 1))
elif integer_list[midpoint] < key_point:
return bsearch(integer_list, key_point, (midpoint + 1), end)
def main( ):
integer_list = [x + 1 for x in range(0, 10)]
key = 11
p = len(integer_list) - 1
start = integer_list[0]
end = integer_list[p]
while key >= 1:
bsearch(integer_list, key, start, end)
print(bsearch(integer_list, key, start, end))
key = key - 1
答案 0 :(得分:2)
您有以下错误:
1)binary_search
对main
的调用包含start = 1 and
end = 10 which should have been
start = 0和end = 9
(索引值).We根据指数找到所有中点。
2)只需检查start > end
,因为start == end
绝对正确,而None
的情况都是由于这种情况造成的。由于这种情况而退回的所有情况实际上都是integer_list[midpoint] == key_point
为真的情况。
以下是更正后的代码:
def bsearch(integer_list, key_point, start, end):
midpoint = (start + end) // 2
if start > end:
return None
elif integer_list[midpoint] == key_point:
return key_point
elif integer_list[midpoint] > key_point:
return bsearch(integer_list, key_point, start, (midpoint - 1))
elif integer_list[midpoint] < key_point:
return bsearch(integer_list, key_point, (midpoint + 1), end)
def main():
integer_list = [x + 1 for x in range(0, 10)]
key = 11
p = len(integer_list) - 1
start = integer_list[0]
end = integer_list[p]
while key >= 1:
print(bsearch(integer_list, key, 0, p))
key = key - 1
main()
希望有所帮助:)
答案 1 :(得分:1)
您在算法中多次混合索引和值。 你的基础/发现案例应该返回中点,因为那是你找到它的地方,但是你要返回key_point,而不是你实际搜索的值。
同样,当您设置循环时,您将开始和结束值设置为开头和结尾列表的内容,而不是开始和结束索引。如果对于test_list,您使用的一组数字不仅仅是序号1-11,那么其中一些错误会变得更加明显。现在它正好排队。
答案 2 :(得分:1)
首先,您将值传递给函数而不是索引:
start = 0
end = len(integer_list) - 1
其次,当开始和结束都反转时,你需要返回None。不是在他们平等时
if start > end:
return None
第三,为什么要返回您要搜索的值?它没有任何意义。您应该返回元素的索引。
elif integer_list[midpoint] == key_point:
return mid_point
最后,如果你想要遵循几乎所有搜索方法返回的内容,当你找不到你想要的值时,你应该返回-1,而不是None。这将为您省去一些麻烦。
if start > end:
return -1