代码的时间复杂度
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 ++
换句话说第三个循环的时间复杂度是什么?
答案 0 :(得分:4)
内循环是O(log n)
,因为“增量”步骤实际上是乘法。
这意味着整个算法都是O(n^2 log n)
。
count++;
在恒定时间内执行,因此它对大O分析没有任何贡献。
答案 1 :(得分:1)
如果要彻底分析算法,可以使用Sigma表示法分析count++;
执行的次数
因此,您的算法在O(n^2 · log n)
中运行。
注意:(*)
的所有值都不等于n
(2
)的倍数,等式n%2 != 0
成立。如果n
是2
(n%2 = 0
)的倍数,则只需删除等式{{}后面的floor function {{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