嵌套for循环的时间复杂度

时间:2015-06-11 13:40:29

标签: algorithm loops big-o time-complexity nested-loops

以下样本循环具有O(n ^ 2)时间复杂度 任何人都可以解释为什么它是O(n ^ 2)?因为它取决于c的价值......

循环1 ---

 for (int i = 1; i <=n; i += c) 
 {
    for (int j = 1; j <=n; j += c) 
    {
      // some O(1) expressions
    }
 }

循环2 ---

 for (int i = n; i > 0; i -= c) 
 {
    for (int j = i+1; j <=n; j += c)
   {
      // some O(1) expressions
   }
 }

如果c = 0;然后它运行无限次,以类似的方式,如果c值增加,那么内循环运行的次数将减少

有人可以向我解释一下吗?

3 个答案:

答案 0 :(得分:1)

这些代码部分中的每一部分都花费时间O(n ^ 2 / c ^ 2)。 c在这里可能被认为是严格的正常数,因此O(n ^ 2 / c ^ 2)= O(n ^ 2)。但这完全取决于背景......

答案 1 :(得分:1)

Big-O表示法是算法复杂性的相对表示。

Big-O没有说明算法在任何情况下会进行多少次迭代。

它说在最坏的情况下你的算法将进行n平方计算。如果你必须比较2种算法,那么这很有用。

在你的代码中,如果我们假设 c 是一个常量,则可以从Big-O表示法中忽略它,因为Big-O完全是关于比较以及如何缩放。常数不起作用的地方。

但是当c不是常数时,正确的Big-O表示法将是O(n ^ 2 / c ^ 2)。

通过cletus阅读this对Big-O的精彩解释。

答案 2 :(得分:0)

对于每个FIXED c,时间为O(n ^ 2)。除非c = 0,否则迭代次数大致为max(n ^ 2 / c ^ 2,n ^ 2)。对于每个固定的n,n ^ 2 / c ^ 2是O(n ^ 2)。

如果您有在循环期间更改了c的代码,您可能会得到不同的答案。