我正在用Python开发二进制搜索功能。它不起作用,显示为空。
我试图用Pseudocode设置逻辑,我的老师说它可以工作,但是他们不知道为什么算法和函数正在做他们正在做的事情。我已经使伪代码上的油脂变得稀疏,并且多个人已经能够解决我的问题。
def binary_search(array,item):
start_point = 0
end_point = len(array)
mid_point = int((start_point + end_point) / 2)
array.sort()
print(array)it
while array[mid_point] != item:
if array[mid_point] > item:
start_point = mid_point
elif array[mid_point] < item:
end_point = mid_point
if array[mid_point] == item:
print(mid_point)
binary_search([0,99,2,6,4,8],7)
我希望此函数起作用,以便当您输入数组和搜索词时它会显示数组中的位置(索引值)
答案 0 :(得分:2)
您实际上并没有对start_point
和end_point
做任何事情。
此外,如果中间的元素大于您要查找的元素,您是否不想将end_point
移动到中间? Elif语句也有同样的问题-如果中间的元素小于要查找的元素,则需要将start_point
移到中间。
答案 1 :(得分:1)
使用此伪代码,您做得很好,但是,它并不完整。请考虑以下几点:
while
变成mid_point
,则需要在zero
循环中添加一个条件才能停止。mid_point
条件的每个分支处更新if
的值。1
的第一个赋值中减去mid_point
,因为 python 是零索引语言。 这是该代码的有效版本:
def binary_search(array,item):
start_point = 0
end_point = len(array)
mid_point = int((start_point + end_point) / 2)-1
array.sort()
print('array after sorting:',array)
while mid_point < len(array) and mid_point > 0:
if array[mid_point] == item:
print('item found at cell:',mid_point,', Note that array index starts from zero!')
return
elif array[mid_point]>item:
end_point = mid_point
mid_point = int((start_point + end_point) / 2)
else:
start_point = mid_point
mid_point = int((start_point + end_point) / 2)
print('number not found!')
return
binary_search([0,99,2,6,4,8,12,13,17,15],8)
答案 2 :(得分:1)
首先,在解决问题之前,我们先讨论二进制搜索,
二进制搜索:通过将搜索间隔重复分成两半来搜索排序的数组。从覆盖整个数组的间隔开始。如果搜索键的值小于间隔中间的项目,请将间隔缩小到下半部分。否则将其缩小到上半部分。
在这里,每次while循环完成它的单循环时,您都需要更改中点,然后您需要检查项目是在下半部还是在上半部(如果它存在于下半部),那么您需要更改端点而不开始点,如果在上半部分,则更改下点
还有一件重要的事情,在您的while条件中,如果没有元素,则它将处于无限循环中,因此您的while循环条件必须为while(end_point> start_point),因为我们正在每个循环中更改点。
参考代码:
def binary_search(array,item):
start_point = 0
end_point = len(array)
array.sort()
print(array)
while end_point > start_point:
mid_point = int((start_point + end_point) / 2)
if array[mid_point] < item:
start_point = mid_point+1
elif array[mid_point] > item:
end_point = mid_point-1
elif array[mid_point] == item:
print(mid_point)
return
print("ELement is not present")
binary_search([0,99,2,6,7,8],3)
答案 3 :(得分:0)
出问题的是,while
循环在每次迭代时都比较array[mid_point]
的相同值,因此如果条件满足,就会陷入无限循环。
二进制搜索是一种递归方法,每次迭代都会迭代同一列表中较小的元素,直到获得所需元素的索引(如果它存在于列表中)。
如果您对array
进行切片并递归调用binary_search
,则将新列表作为参数传递,则您的代码将起作用。然后可以用简单的while
条件替换if
循环。
有关更多参考,请检查this link并与您的函数进行比较以了解不同之处。 :)