You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归中列表切片与索引实现的复杂度对比

递归二分查找:切片实现 vs 索引实现的复杂度差异

用列表切片编写递归函数,在时间和空间复杂度上确实存在明显劣势,这也是主流递归实现更偏爱low/high索引方式的核心原因。

时间复杂度对比

  • 索引版(binSearch2):每次递归仅做O(1)的计算(计算mid、元素比较),递归深度为O(log n),整体时间复杂度保持二分查找的最优O(log n)。
  • 切片版(binSearch):Python的列表切片操作(如arr[mid+1:])会创建全新的子列表,这个操作的时间开销是O(k)(k为子列表长度)。每次递归都会生成一个约为原列表一半长度的新列表,所有递归步骤中创建的子列表总长度为n + n/2 + n/4 + ... ≈ 2n,整体时间复杂度退化为O(n),完全失去了二分查找的性能优势。

空间复杂度对比

  • 索引版:递归调用栈深度为O(log n),仅需存储low、high、mid几个整数变量,额外空间复杂度为O(log n)。
  • 切片版:除了O(log n)的递归栈开销,每个递归调用都会创建新的子列表,这些子列表的总空间开销为O(n),整体空间复杂度升至O(n),远高于索引版。

两种实现代码示例

列表切片实现

def binSearch(arr,k):
    if len(arr) < 1:
        return -1
    mid = len(arr) // 2
    if arr[mid] == k:
        return mid
    elif arr[mid] < k:
        val = binSearch(arr[mid+1:],k)
        if val == -1:
            return -1
        else:
            return mid + 1 + val
    else:
        return binSearch(arr[:mid],k)

索引实现

def binSearch2(arr,k,low,high):
    if low > high:
        return -1
    mid = (high+low) // 2
    if arr[mid] == k:
        return mid
    elif arr[mid] < k:
        return binSearch2(arr,k,mid+1,high)
    else:
        return binSearch2(arr,k,low,mid-1)

内容的提问来源于stack exchange,提问作者Guilherme Costa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 14:24:19