【问题标题】:Returning next highest value with binary search使用二分搜索返回下一个最大值
【发布时间】:2017-02-14 09:34:30
【问题描述】:

在我的二分搜索中,如果找不到目标,我想返回下一个最高元素的索引。

例如[1,2,3,4,5,7],如果我要搜索6,它应该返回7的位置。

我正在测试 aList = [2, 8, 17, 42, 79, 85]

当我搜索 31880 时,它可以工作。但是,当我搜索 94386 时,它返回的索引比应有的低 1。

def recursiveBinarySearch(aList, first, last, target):

    if last - first + 1 <= 0:
        return False
    else:
        midpoint = first + (last - first) // 2
        if aList[midpoint] == target:
            return midpoint
        elif last - first + 1 == 1:
            return midpoint 
        else:
            if target < aList[midpoint]:
                return recursiveBinarySearch(aList, first, midpoint-1, target)
            else:
                return recursiveBinarySearch(aList, midpoint+1, last, target)

【问题讨论】:

标签: python algorithm binary-search


【解决方案1】:
aList = [1,3,5,6,8,9,10,12,34,56,78,456, 777]
def recursiveBinarySearch(aList, target, index):
    #aList = sorted(aList)
    print(aList, index)
    if len(aList) <= 1:
        if index==0 and aList[0]==target:
            return index
        else:   
            return index+1

    else:
        midpoint = len(aList) // 2
#        print(midpoint)
        if aList[midpoint] == target:
            return aList.index(target)+index
        else:
            if target < aList[midpoint]:
                return recursiveBinarySearch(aList[:midpoint],target, index)
            else:
                return recursiveBinarySearch(aList[midpoint:],target, index+len(aList[:midpoint]))

print(recursiveBinarySearch(aList,3,0))

这应该工作:) 修正了搜索第一个数字时的错误。

【讨论】:

  • 感谢我在自己的代码上返回 last + 1 时它可以工作
  • 二分查找的优点是需要 O(log n) 时间。在标准 Python 实现中,切片需要 O(n) 时间,因此二进制搜索的优势被打败了。您的解决方案应该对 Numpy 数组有效——对它们进行切片在 O(1) 中工作。但是使用 Python 列表就不好了。
猜你喜欢
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2021-12-21
  • 2019-11-10
  • 2013-07-14
  • 1970-01-01
  • 2012-11-25
  • 2022-06-14
相关资源
最近更新 更多