[英]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.