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

Python 如果找不到值,则在二进制搜索中返回较低的数字,python,binary-search,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] &g

我有一个排序的数字列表<代码>[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]
def搜索值(数据,n):
低=0
高=透镜(数据)-1
如果数据[-1]=时间:
返回
低<高:
中=(低+高)/2
如果数据[mid]==n:
返回数据[n]
如果数据[mid]>n:
高=中-1
如果数据[mid]
这将解决您的所有问题,并且应该更快一些:

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]
def搜索值(数据,n):
低=0
高=透镜(数据)-1
低氮时:
高=中-1
elif数据[mid]高
如果高>=0:
返回数据[高]
#所有值均大于n。只需返回第一个。能够
#将更改为不返回。
返回数据[0]
请注意,如果所有值都是
>n
,则返回第一个值。如果需要,您当然可以将其更改为返回
None


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

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

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]
def搜索值(数据,n):
低=0
高=透镜(数据)-1
低氮时:
高=中-1
elif数据[mid]高
如果高>=0:
返回数据[高]
#所有值均大于n。只需返回第一个。能够
#将更改为不返回。
返回数据[0]
请注意,如果所有值都是
>n
,则返回第一个值。如果需要,您当然可以将其更改为返回
None


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

列表是否保证有序?如果没有,请尝试以下操作:

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

结果=最大值((如果n列表是否保证有序,则数据中的n代表n)?如果不是,请尝试以下操作:

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

result=max((n表示数据中的n,如果n问题要求进行二进制搜索,则为n,因此给定值已排序。此解决方案不是二进制搜索,并且不满足二进制搜索所需的O(log(len))性能。此解决方案改为O(len)。您是正确的,但问题规范中应说明该条件。该问题要求进行二进制搜索,因此给定值已排序。此解决方案不是二进制搜索,并且不满足二进制搜索所需的O(log(len))性能。此解决方案改为O(len).您是正确的,但问题说明中应说明该条件。