求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
相关产品推荐
相关产品推荐

