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

求解下述Python代码的时间复杂度:是O(n²)还是O(n)?

分析这段代码的时间复杂度

咱们来一步步拆解这段代码的时间复杂度,先看一下你给出的代码:

thelist = [[2,3],[],[]]
n=len(thelist)
for i in range(1,n):
    if i <= k:
        thelist[i].append(1)
    for j in thelist[i-1]:
        c = j+1
        thelist[i].append(c)

这段代码的核心逻辑是外层循环遍历i从1到n-1,内层循环遍历前一个子列表thelist[i-1]的元素。时间复杂度的关键取决于内层循环的总执行次数,而这又和变量k的取值紧密相关,咱们分两种典型情况讨论:

情况1:k是固定常数(不随n变化)

比如k=2、k=5这类固定值,不管n多大,k都保持不变。

咱们来追踪各层子列表的长度变化:

  • 初始时thelist[0]的长度是2(对应元素[2,3])
  • 当i从1到k时:每个i对应的子列表长度 = 前一层子列表长度 + 1(因为i<=k会执行一次append(1)),到i=k时,thelist[k]的长度是2 + k,这是一个固定常数
  • 当i>k时:不再执行append(1),所以每个i对应的子列表长度等于前一层的长度,也就是保持2 + k不变

现在计算总内层循环次数:

  • 前k次外层循环(i=1到k):内层循环次数分别是2、3、4、...、(2+k-1),这是一个等差数列,总和是固定常数(因为k是常数)
  • 剩下的n-1 -k次外层循环:每次内层循环次数都是2 + k(固定常数),总次数是(n -k -1) * (2 +k),这部分的增长量级是O(n)

把两部分加起来,总操作次数是「固定常数 + O(n)」,所以整体时间复杂度是O(n)。

情况2:k和n线性相关(比如k = n-1或k = cn,c是常数)

如果k的大小随n同步增长,比如k等于n-1(也就是每个i都满足i<=k),那各层子列表的长度会持续递增:

  • i=1时,内层循环次数是2,子列表长度变为2+1=3
  • i=2时,内层循环次数是3,子列表长度变为3+1=4
  • ...
  • i=n-1时,内层循环次数是2 + (n-2),子列表长度变为2 + (n-1)

这时候内层循环的总次数是2+3+4+...+n,这是首项为2、末项为n、项数为n-1的等差数列,总和为(n-1)*(2 +n)/2,增长量级是O(n²)。这种情况下整体时间复杂度就是O(n²)。

总结

这段代码的时间复杂度不能一概而论,核心取决于k的取值:

  • 若k是固定常数,时间复杂度为O(n)
  • 若k随n线性增长(比如k≈n),时间复杂度为O(n²)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:29:58