for(j=n; j>1; j/=2)
++p;
for(k=1; k<p; k*=2)
++q;
在第一个代码示例中, p 变量属于 1st 循环。那么,即使它们不是嵌套循环, 2nd 也会返回 log(n)吗?我的意思是, O(loglog(n))?
for(i=n; i>0; i--){
for(j=1; j<n; j*=2){
for(k=0; k<j; k++){
//statements-O(1)
}
}
}
而这些,它们是嵌套的,但 k 变量属于 2nd 循环。那么,它应该与第一个相似吗?像 O(n ^ 2.log(n))或 O(n.log ^ 2(n))?
答案 0 :(得分:3)
算法: 第一个循环需要log(n)时间。第二个循环占用log(log(n))时间。所以你有log(n)+ log(log(n))。但是第一个循环更重要。所以它是 O(log(n))。
算法:首先看一下当你只分析两个外部for循环时的运行时(意味着n log(n))。但遗憾的是,循环内部的第三个变得更加复杂。
第三个for循环从0到2 ^ m计数,其中m = log(n)。所以你必须将2 ^ m从0加到log(n)-1,即n-1。所以n-1是两个内部for循环的运行时间。现在你必须将它乘以外部for循环的线性运行时间。所以它是(n-1)n,它是n²-n。所以你有三个循环的 O(n²)。