三个嵌套循环的时间复杂度?

时间:2016-04-06 19:29:45

标签: algorithm time-complexity big-o complexity-theory

代码的时间复杂度

for(int i=0; i<n;i++){
    for(int j =0; j<n; j++){
        for(int k=1; k<n; k*=2){
            count++;
        }
    }  
}

前2个循环创建一个O(n ^ 2)右?

在第三个循环“int k = 1”执行1次,

k怎么样?

k * = 2

和count ++

换句话说第三个循环的时间复杂度是什么?

2 个答案:

答案 0 :(得分:4)

内循环是O(log n),因为“增量”步骤实际上是乘法。

这意味着整个算法都是O(n^2 log n)

count++;在恒定时间内执行,因此它对大O分析没有任何贡献。

答案 1 :(得分:1)

如果要彻底分析算法,可以使用Sigma表示法分析count++;执行的次数

enter image description here

因此,您的算法在O(n^2 · log n)中运行。

注意:(*)的所有值都不等于n2)的倍数,等式n%2 != 0成立。如果n 2n%2 = 0)的倍数,则只需删除等式{{}后面的floor function Google search card for twitter {{3}} 1}}上面。

现在,从上面我们可以看出,(*)的表达式恰好在上面的符号(T(n))之前或之前指定,它将产生的确切值在循环之后(在循环之前给出count),而不需要隐式地执行嵌套循环。

count=0

如果您的算法只是计算某些内容,那么这非常有用;而不是显式执行循环来执行这样繁琐(并且,对于大T(n) = n^2*(1 + floor(log(n)/log(2))), if n%2 != 0, n^2*(1 + log(n)/log(2)), if n%2 = 0. ,慢)计数任务的值,您可以导出自己的计数数量的公式,就像上面一样,并在程序中使用代替。

我们可以验证为此案例派生的公式是否正确计算实际迭代次数:

n