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

这段C++代码的时间复杂度是O(n²)还是O(nlogn)?

循环时间复杂度分析疑问
for (int i = 1; i <= n; i++) {
   for (int j = 1; j <= n; j += i) {
       // some code
   }
}

外层循环显然运行n次。对于内层循环,假设n=8,运行情况如下:

ij
11, 2, 3, 4, 5, 6, 7, 8 ---> 运行8次
21, 3, 5, 7 ---> 运行4次
31, 4, 7 ---> 运行3次
41, 5 ---> 运行2次
51, 6 ---> 运行2次
61, 7 ---> 运行2次
71, 8 ---> 运行2次
81 ---> 运行1次

我困惑于内层循环的总复杂度应该是logn还是n,希望能得到解答!


解答

这段代码的总时间复杂度既不是O(n)也不是O(logn),而是O(n log n)。

原因如下:

  • 内层循环对每个i的执行次数是⌊n/i⌋(向下取整),总执行次数就是求和式:S(n) = Σ(i=1到n) ⌊n/i⌋
  • 这个求和式的渐近行为可以通过近似积分理解:∫₁ⁿ (n/x)dx = n ln n,对应时间复杂度的渐近上界为O(n log n)
  • 从实际数值看,n=8时总执行次数是8+4+3+2+2+2+2+1=24,刚好等于n×log₂n(8×3=24);n越大,这个求和结果越接近n与对数n的乘积量级

简单来说,这段嵌套循环的时间复杂度是线性对数级,也就是O(n log n)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:13:13