[英]In python, how can i make a binary search function with range and some conditions
对我来说最大的问题是根据范围来表达 mid 的值。 plz我需要帮助即使这不是一个完美的答案,我也需要一个提示。 我什至不知道我很难过的原因是Python笨拙还是我很愚蠢。
def bsearch(ss, x): #just call bsearch_range
return bsearch_range( ss, x, range(len(ss)) )
def bsearch_range(ss, x, r): #ss is list, r=range(len(ss))
left,right=0,0
while len(r)>0:
mid= (r.start+(r.stop-1)) // 2
if ss[mid]==x:
left,right=mid,mid+1
return range(left,right)
elif x<ss[mid]:
right=right-1
else:
left=left+1
return range(left,right)
第一的。 bsearch function 是一个二进制搜索 function,它告诉您要在范围内查找的范围。
第二。 列表已排序并且可能包含重复的数字。 例如)列表 ss=[1,2,2,2,3,6]
所以。 如果列表中存在重复元素,我们需要表示重复元素的范围。 例如)list ss[1,2,2,2,3,6], bsearch(ss,2)==range(1,4)
第三。 如果您要查找的元素在列表中不存在,您应该能够告诉它应该在范围内的位置。 例如)ss[1,2,2,2,3,6] bsearch(ss,7)==range(6,6)
查看您的代码,我相信您并没有完全理解“正常”二进制搜索算法的工作原理。 ( r
是做什么用的?它不会在整个循环体中发生变化,所以 while 循环会永远持续下去……)
作为提示,这是 Python 中的二进制搜索的样子:
def bi_search_left(array: list[int], x: int) -> int:
a, b = 0, len(array)
while a < b:
mid = (a + b) // 2
if array[mid] < x:
a = mid + 1
else:
b = mid
return a
注意,function 的名称是bi_search_left
。 这是因为它返回与x
参数的值匹配的最左边元素的索引。 (实际上,它返回需要插入x
以使其成为具有该值的列表中的第一个元素的索引,因此它也适用于空列表。)
通过稍微更改 function ,您可以获得bi_search_right
,顾名思义,它返回最右边的索引。 结合这两种方法可以得到你想要的结果。
我认为这已经足够暗示了:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.