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

嵌套循环时间复杂度疑问:内层循环从i开始减半执行

嵌套循环时间复杂度分析

首先给出待分析的嵌套循环代码:

for ( i = 1; i <= n; i++) {
   for ( j = i; j >= 1; j = j / 2) {
     // 常数时间操作
   }
}

你的推导问题出在哪?

你对内层循环执行次数的计算是对的:内层循环次数确实是⌊log₂i⌋ + 1(比如i=1时执行1次,i=2时执行2次,i=4时执行3次),求和公式(log1+1)+(log2+1)+...+(logn+1)也没问题,但你错误地把这个和的复杂度推导成了O(n²)。

正确的复杂度推导

把求和公式拆成两部分:

  • 第一部分:log1 + log2 + ... + logn,这等价于log(1×2×3×...×n) = log(n!)
  • 第二部分:1+1+...+1(共n个1),和为n

根据斯特林公式,log(n!)的渐近增长速度是O(nlogn),而第二部分的n是O(n),远慢于O(nlogn)。所以整体求和的主导项是O(nlogn),整个嵌套循环的时间复杂度就是O(nlogn)。

为什么另一种解法(内层次数算logi)结果也对?

渐近复杂度分析里,常数项可以忽略。⌊log₂i⌋ +1和⌊log₂i⌋的渐近增长速度是一样的,都是O(logi),所以不管用哪个来求和,最终的复杂度都是O(nlogn),只是具体的常数项不同,但渐近复杂度只看主导项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:18:33