繁体   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