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

求programB函数中循环语句的时间复杂度及推导步骤

循环时间复杂度推导:不是n³,而是O(log n)

嘿,别担心,这个循环的时间复杂度绝对不是n³,咱们一步步拆解来看就清楚了~

首先先把你的代码贴出来方便分析:

void programB(int n) { 
    long prod = 1; 
    for (int c=1; c<n; c=c*3) 
        prod = prod * c; 
}

核心分析:循环变量的增长规律

这个循环的关键在于循环变量c是按指数级增长的,每次迭代都会乘以3,而不是线性增长(比如c++那种)。我们可以先列出每次循环时c的取值:

  • 第1次循环:c = 1(初始值)
  • 第2次循环:c = 1 * 3 = 3
  • 第3次循环:c = 3 * 3 = 9 = 3²
  • 第4次循环:c = 9 * 3 = 27 = 3³
  • ...
  • 第k次循环:c = 3^(k-1)

推导循环执行次数

循环停止的条件是c >= n,也就是当3^(k-1) >= n时,循环不再执行。我们需要找到最大的k,使得3^(k-1) < n。

对这个不等式两边取以3为底的对数:

log₃(3^(k-1)) < log₃n
=> k-1 < log₃n
=> k < log₃n + 1

这意味着循环最多执行log₃n + 1次,忽略常数项后,循环的时间复杂度就是O(log₃n)。在大O表示法中,对数的底数可以忽略(因为不同底数的对数之间只是常数倍的关系),所以也可以简化为O(log n)。

为什么不是n³?

n³的时间复杂度意味着循环执行次数和n的三次方成正比(比如循环从1跑到n³,每次c++),但这里的c是指数增长,增长速度极快,只需要log级别的次数就会达到n的量级,和三次方完全没有关系哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:41:29