Python 3.x 二进制搜索在Python中的实现
我正在尝试使用二进制搜索实现一个解决方案。我有一张号码表Python 3.x 二进制搜索在Python中的实现,python-3.x,binary-search,Python 3.x,Binary Search,我正在尝试使用二进制搜索实现一个解决方案。我有一张号码表 list = [1, 2, 3, 4, 6] value to be searched = 2 我写过这样的东西 def searchBinary(list, sval): low = 0 high = len(list) while low < high: mid = low + math.floor((high - low) / 2) if list[mid] ==
list = [1, 2, 3, 4, 6]
value to be searched = 2
我写过这样的东西
def searchBinary(list, sval):
low = 0
high = len(list)
while low < high:
mid = low + math.floor((high - low) / 2)
if list[mid] == sval:
print("found : ", sval)
elif l2s[mid] > sval:
high = mid - 1
else:
low = mid + 1
def searchBinary(列表,sval):
低=0
高=长(列表)
低<高:
中=低+数学楼层((高-低)/2)
如果列表[mid]==sval:
打印(“找到:”,sval)
elif l2s[mid]>sval:
高=中-1
其他:
低=中+1
但当我试图实现这个时,我得到了一个错误,比如:索引超出范围。请帮助确定问题。一些事情
list
作为变量名,这是在隐藏全局内置项,而低一些事情
你的名字不一致。另外,不要使用list
作为变量名,这是在隐藏全局内置项
根据下面的注释,停止条件为,而低更新high=len(lst)-1
三个问题:
您使用了l2s
而不是list
(参数的实际名称)
您的while
状态应为low根据下面的注释更新high=len(lst)-1
三个问题:
您使用了l2s
而不是list
(参数的实际名称)
您的while
条件应该是低,为什么不返回任何内容?编辑:Nvm,你把它打印出来。什么是l2s?你是说那里有列表
?(另外,永远不要命名变量list
…它隐藏了Python内置的list
)好的,明白了。它希望我在找到值的情况下返回一些内容。您似乎将l2s
与list
…为什么不返回任何内容?编辑:Nvm,你把它打印出来。什么是l2s?你是说那里有列表
?(另外,永远不要命名变量list
…它隐藏了Python内置的list
)好的,明白了。它希望我在找到值时返回一些内容。您似乎将l2s
与list
交错…问题是因为我初始化了high=len(lst),但它应该是high=len(lst)-1。我还了解到,初始化mid=low+(high-low)/2以防止溢出是一种很好的做法。您认为它应该是len(lst)-1
<代码>低+(高-低)/2
与(低+高)/2
相同。我只是简化了表达式。是的,它们是相同的,但是(低+高)/2会产生溢出,所以建议使用其他方法。如果low+high
太大,你说的是整数溢出?这似乎是一个奇怪的问题,我相信Python中完全没有问题。是的,假设high=2^31,low=1,我尝试(high+low),那么它将破坏代码。这与我的问题无关。我只是在浏览解决方案时阅读了它。问题是因为我初始化了high=len(lst),但它应该是high=len(lst)-1。我还了解到,初始化mid=low+(high-low)/2以防止溢出是一种很好的做法。您认为它应该是len(lst)-1
<代码>低+(高-低)/2
与(低+高)/2
相同。我只是简化了表达式。是的,它们是相同的,但是(低+高)/2会产生溢出,所以建议使用其他方法。如果low+high
太大,你说的是整数溢出?这似乎是一个奇怪的问题,我相信Python中完全没有问题。是的,假设high=2^31,low=1,我尝试(high+low),那么它将破坏代码。这与我的问题无关。我只是在浏览解决方案时阅读它。
def searchBinary(l2s, sval): # do not use 'list' as a variable
low = 0
high = len(l2s)
while low <= high: # this is the main issue. As long as low is not greater than high, the while loop must run
mid = (high + low) // 2
if l2s[mid] == sval:
print("found : ", sval)
return
elif l2s[mid] > sval:
high = mid - 1
else:
low = mid + 1
list_ = [1, 2, 3, 4, 6]
searchBinary(list_, 2)
found : 2
def binary_search(lst, sval):
low = 0
high = len(lst) - 1
while low <= high:
mid = (low + high) // 2
if lst[mid] == sval:
return mid
elif lst[mid] > sval:
high = mid - 1
else:
low = mid + 1
return None
print(binary_search([1, 2, 3, 4, 6], 2)) # 1