【问题标题】:Time complexity of for loopfor循环的时间复杂度
【发布时间】:2026-01-18 03:45:01
【问题描述】:

是 O(n) 还是 O(n*n)?

循环运行大约 n*n 次,但循环变量只有一个。

我很困惑它是否是 O(n) 算法 我认为它应该是 O(n*n) 但 gfg 说它是 O(n)

谁能帮我解答一下?

int j=0;
for(int i=1; i<=n; )
{
   if(j<i)
   {
     j++;
     continue;
   }

   if(j==i)
   {
     i++;
     j=0;
   }
}

【问题讨论】:

  • 你认为循环为什么会运行n * n 次? (仔细检查我认为你是对的,因为 i 不会在每次循环运行时增加,但很高兴听到你对此的推理。)
  • 循环没有副作用,可以被编译器丢弃,导致时间复杂度 O(1)。
  • 循环运行大约 nn 次* -- 如前所述,C++ 编译器可能只是删除整个循环,因为它所做的只是旋转*,实际上什么都不做这会影响更大程序的任何其他部分。
  • 但是 gfg 说它是 O(n) -- 如果他们说这就是答案,为什么不在“gfg”那里讨论呢?或者你这样做了,他们告诉你“对不起,你错了”?他们有一个论坛,不是吗?此外,如果这是您的目标,我不建议您使用“gfg”网站来学习 C++ 编程。
  • 它不是算法,因为它什么都不做。它改变的 j 结束后再次为 0。因此,符合 C++ 的实现可能会删除 for 循环作为优化。

标签: java c++ loops for-loop time-complexity


【解决方案1】:

这是 O(1 + 2 + ... + n + n),即等差数列 1 到 n 加 n 的总和,总和是 O(n * (n + 1) / 2 + n ) ≈ O(n²)。

【讨论】:

  • 我相信是1 + 2 + ... + n + n
  • @u 很好,你是对的。
【解决方案2】:

我认为这个循环运行了 1 + 2 + ... + n 次,因为随着 i 的增长,j 需要增加 i - 1 倍,i 增长 n 倍。这给出了 O(n^2) 的时间复杂度。

【讨论】: