【问题标题】:Binary Search Algorithm with interval带区间的二分搜索算法
【发布时间】:2017-04-12 07:30:57
【问题描述】:

我正在尝试更改我的代码,而不是查找数组的特定值,如果找到,它将输出一个区间的值,例如 60-70。任何帮助表示赞赏。

def binary (array, value):

    while len(array)!= 0:
        mid = len(array) // 2

        if value == array[mid]:           
            return value
        elif value > array[mid]:       
            array = array[mid+1:]
        elif value < array [mid]:          
            array = array[0:mid]

sequence = [1,2,5,9,13,42,69,123,256]

print( "found", binary(sequence,70) ) 

到目前为止,我有这个并希望它找到一个指定的间隔,所以如果我指定 60-70,它会找到介于两者之间的内容。

【问题讨论】:

  • binaryInterval 函数有什么作用?它已定义但从未调用。
  • 请更清楚要返回的时间间隔和格式。您的示例60-70 在您的示例sequence 中似乎没有意义。还是我的部分理解完全错误?
  • 您的意思是它应该定位该区间内的值,在本例中为69
  • 是的,我正在尝试更改 binaryInterval 函数,以便它可以定位区间中的值,所以是的,例如 69
  • 我已经编辑了我写的内容希望它更容易理解

标签: python algorithm search binary


【解决方案1】:

其实这很简单:
在查找区间(lower, upper)中的元素时,对数组arr进行二分查找,找到最小元素arr[n]的索引,如arr[n] &gt;= lower和最大元素arr[m]的索引,如那个arr[m] &lt;= upper

现在有几种可能:

  • n n 到索引m 包括
  • n = m:只存在一种解决方案:arr[n]
  • n > m:不存在解决方案

可以使用二进制搜索来搜索超过某个阈值的值,如下所示:

def lowestGreaterThan(arr, threshold):
    low = 0
    high = len(arr)

    while low < high:
        mid = math.floor((low + high) / 2)

        print("low = ", low, " mid = ", mid, " high = ", high)

        if arr[mid] == threshold:
            return mid
        elif arr[mid] < threshold and mid != low:
            low = mid
        elif arr[mid] > threshold and mid != high:
            high = mid
        else:
            # terminate with index pointing to the first element greater than low
            high = low = low + 1

    return low

对不起,代码看起来很糟糕,我的 python 远非完美。无论如何,这应该显示该方法背后的基本思想。该算法基本上搜索具有属性arr[ind] &gt;= threshold的数组中第一个元素的索引ind

【讨论】:

  • 嗨,我理解你所说的上下两部分,但我不知道如何应用这个(对不起,我正在学校学习编码,只是想学习)
  • @PeterMikel 嗯,二分搜索不仅可以用于搜索数组中的特定值,还可以用于搜索超出某个阈值的值。我会用一个例子来更新答案。
  • @PeterMikel 很高兴为您提供帮助 :) 因为您似乎是新来的:在这里很常见,如果答案可以解决您的问题,则将其标记为已接受。 This article 描述了如何做到这一点;)
猜你喜欢
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2017-01-06
  • 2012-04-04
  • 1970-01-01
  • 2014-02-03
相关资源
最近更新 更多