Python 我想做一个二进制搜索,但结果是错误的
我想对一个列表进行二进制搜索,但结果显示“false”,即使我从列表中选择了一个数字Python 我想做一个二进制搜索,但结果是错误的,python,binary-search,Python,Binary Search,我想对一个列表进行二进制搜索,但结果显示“false”,即使我从列表中选择了一个数字 def clist(a): l = [2,6,5,9,7,1,4,8,3] newl = sorted(l) check = int(1+len(newl)/2) if newl[check] == a: return True if check > a: for x in newl[:check]: i
def clist(a):
l = [2,6,5,9,7,1,4,8,3]
newl = sorted(l)
check = int(1+len(newl)/2)
if newl[check] == a:
return True
if check > a:
for x in newl[:check]:
if x == a:
return True
return False
if check < a:
for x in newl[check::]:
if x == a:
return True
return False
print(clist(7))
def clist(a):
l=[2,6,5,9,7,1,4,8,3]
newl=已排序(l)
检查=int(1+len(newl)/2)
如果newl[check]==a:
返回真值
如果选中>a:
对于新的x[:检查]:
如果x==a:
返回真值
返回错误
如果检查
请检查以下内容:
def clist(a):
l = [2,6,5,9,7,1,4,8,3]
newl = sorted(l)
check = int(1+len(newl)/2)
if newl[check] == a:
return True
if newl[check] > a: #fixed the bug here
for x in newl[:check]:
if x == a:
return True
if newl[check] < a: #fixed the bug here
for x in newl[check:]:
if x == a:
return True
return False #Return false should be universal. When the entire search fails it should be called.
print(clist(7))
def clist(a):
l=[2,6,5,9,7,1,4,8,3]
newl=已排序(l)
检查=int(1+len(newl)/2)
如果newl[check]==a:
返回真值
如果newl[check]>a:#修复了此处的错误
对于新的x[:检查]:
如果x==a:
返回真值
如果newl[check]
您的函数不是二进制搜索,而是在检查中间元素之后,逐个检查已排序列表的元素
def binary_search(arr, i):
n = len(arr)
arr = sorted(arr)
left = 0
right = n - 1
# Define the condition when the loop should be broken
while (left <= right):
mid = left + (right-left) // 2
if arr[mid] == i:
return True
elif arr[mid] < i:
left = mid + 1
else:
right = mid - 1
return False
l = [2,6,5,9,7,1,4,8,3]
i = 7
binary_search(l, i)
def二进制搜索(arr,i):
n=长度(arr)
arr=已排序(arr)
左=0
右=n-1
#定义应在何时断开循环的条件
而(左您可以这样编写脚本:
以列表中间的元素为例
如果你需要的话,把它还给我
如果指针
大于中间位置,则调用列表剩余右侧的b搜索
othwewise调用b用左侧搜索
def b搜索(针、草堆):
l=len(干草堆)
一半=整数(l/2)
元素=干草堆[一半];
如果元素==指针:
返回元素
如果针元件:
返回b搜索(针、草堆[一半:l])
打印(b搜索(7、[1、2、3、4、5、6、7、8、9、10]))
在二进制搜索中:
必须对列表进行排序
正如@tripleee所述,您必须递归地将列表一分为二
无论如何,这不是二进制搜索。您将列表拆分一次,然后恢复为线性搜索。正确的二进制搜索将继续将列表拆分为两半,直到只剩下一个元素。但是,如果您将列表作为例程的一部分进行排序,您将遍历所有列表。二进制搜索只有在您已经知道输入是正确的情况下才有意义排序。这个答案对OP有什么帮助?看起来你试图做的是问一个问题或做一个评论(“你能看看这个代码在做什么吗?”或“请描述一下代码做什么以及为什么。”)。添加了注释。希望有帮助。1.可能应该放在注释中。2.可能是OP是二进制搜索的学习阶段。这就是为什么我没有给出明确的答案。我刚刚修复了错误。幸运的是,您拥有的不是二进制搜索。:-(您是对的,OP可能正在学习它(事实上,这很有可能是真的),但演示代码就是给出一个明确的答案,因此添加关于您所做的事情的文字并不会改变这一点。它只是让答案更具可读性(这是一件好事)。:-)如果您的脚本与第一个if语句不匹配,它就不再是对数的。此代码不适用于指针不在草堆中的情况。请尝试b搜索(1[0,2,3])
(它给出了一个递归错误
)和b搜索(0[1,2,3])``(它给出了一个索引器
)。看起来OP想要返回True
,如果项目在列表中,则返回False
。但更重要的是,OP想要知道他们的代码有什么问题。这里的答案似乎都不能解决这个问题。嗨,我的只是一个关于如何编写b search
的快速提示,它无法处理任何问题edge case(我认为很容易添加)。返回True/False
也很容易。我的回答的全部范围是显示算法本身背后的逻辑(递归调用bsearch,使用一半初始输入)这就是op的代码的问题所在。我看到了所有的答案和评论,从中我学到了一些东西。我是一个编码新手。现在,我明白了什么是二进制搜索。谢谢。