簡體   English   中英

在 python 中,我如何在范圍和一些條件下進行二進制搜索 function

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM