传递切片列表以使用python实现二进制搜索

2024-10-04 01:35:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在学习一些算法,我混淆了这两个二进制搜索实现之间的时间复杂性和空间复杂性,如下所示

对于第一个实现(bin_search1),我认为时间复杂度是O(klogn),空间复杂度是O(n),因为使用列表切片是O(k)

def bin_search1(arr, key):
    n = len(arr)
    if n < 2:
        return (0 if (n == 1 and arr[0] == key) else None)
    m = int(0.5 * n)
    if arr[m] > key:
        return bsearch3(arr[:m], key)
    result = bsearch3(arr[m:], key)
    return (result + m if result != None else None)

对于第二个实现(bin_search2),时间复杂度为O(logn),空间复杂度为O(1),因为只调用原始列表上的位置

def bin_search2(arr, key, left=0, right=len(arr)):
    if left >= right:
        return None
    m = int(0.5 * (left + right))
    if arr[m] == key:
        return m
    elif arr[m] > key:
        return bsearch3_fix(arr, key, left, m)
    return bsearch3_fix(arr, key, m + 1, right)

你能告诉我我对其复杂性的理解吗


Tags: keyrightnonereturnifbin时间空间