【问题标题】:returning lower number in binary search if value cannot be found如果找不到值,则在二进制搜索中返回较小的数字
【发布时间】:2021-06-05 06:12:40
【问题描述】:

我有一个排序后的数字列表。 [1,2,4,6,10,12]

我想在列表中找到一个数字。如果找不到,我想返回下一个最小的数字。

例如,n = 8。我搜索 8 但找不到它。然后我将返回 6,因为它是下一个最小的数字。

我有一些代码,但似乎无法正确索引:

def search_val(data, n):
    low = 0
    high = len(data) - 1
    if data[-1] <= n:
        return data[-1]
    if data[0] >= time:
        return

    while low < high:
        mid = (low + high) / 2
        if data[mid] == n:
            return data[n]
        if data[mid] > n:
            high = mid -1
        if data[mid] < n:
            low = mid + 1
    if data[low] < n:
        return data[low]
    else:
        return data[low - 1]

【问题讨论】:

    标签: python binary-search


    【解决方案1】:

    这将解决您的所有问题,并且应该更快:

    def search_val(data, n):
        low = 0
        high = len(data) - 1
    
        while low <= high:
            mid = (low + high) // 2
    
            if data[mid] > n:
                high = mid -1
            elif data[mid] < n:
                low = mid + 1
            else:
                return data[mid]
    
        # Now low > high
    
        if high >= 0:
            return data[high]
    
        # All values are > n.  Just return the first.  Could
        # be changed to return None.
    
        return data[0]
    

    注意,在所有值都是&gt; n 的情况下,它返回第一个值。如果需要,您当然可以将其更改为返回 None

    还要注意它假定len(data)&gt;= 1。如果情况并非总是如此,您可以在顶部添加一个检查,如果 data 是空列表,则返回 None

    【讨论】:

      【解决方案2】:

      列表是否保证有序?如果没有,试试这个:

      data = [1,2,4,6,10,12]
      result = max((n for n in data if n <= 8))
      

      【讨论】:

      • 这个问题需要二分搜索,所以它的值是排序的。该解决方案不是二分查找,不满足二分查找所需的 O(log(len)) 性能。这个解决方案是 O(len)。你是对的,尽管问题规范中应该已经说明了条件。
      猜你喜欢
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2021-06-28
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多