如果无法找到值,则返回二进制搜索中的较低数字

时间:2016-02-18 04:17:16

标签: python binary-search

我有一个已排序的数字列表。 [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]

2 个答案:

答案 0 :(得分: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]

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

另请注意,它假定len(data)>= 1。如果情况并非如此,您可以在顶部添加一项检查,如果None为空列表,则返回data

答案 1 :(得分:1)

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

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