for(int i = 1; i < n; i = i ∗ 2){
for(int j = 0; j < n; j++){
if(i == j){
for(int k = 0; k < n; k++){
// Do something elementary
}
}else{
// Do another elementary thing
}
}
}
我正在做一些运动,有人可以帮我弄清楚上述算法的Θ吗?我知道如果它只是两个外部嵌套循环,时间复杂度应该是Θ(nlogn)。但我不知道如何对待if-else语句。提前谢谢了!
答案 0 :(得分:3)
执行外循环log(n)
次,因为每次加倍i的值
然后你执行内循环n
次,最后一个内循环inf你执行一次的if语句(如果i == j
成立)n
次,这就是整个内循环需要每次n + n
步。
这为你提供了O(2n log(n))
的上限,并且因为常量不会改变渐近复杂度,所以运行时受O(n log(n))
for(int i = 1; i < n; i = i ∗ 2){ ----------
for(int j = 0; j < n; j++){ ---------- |
if(i == j){ | |
for(int k = 0; k < n; k++){ ---- | |
// Do something elementary | (n | + n ) | * log(n)
} ---- | |
}else{ | |
// Do another elementary thing | |
} ---------- |
} |
} |
------------
请注意,最内部循环每秒只执行一次大多数内循环(!),并且由于第二个最内循环执行log n
次(有n
步),我们必须添加最内循环的n
次到第二个最内循环的运行时间,然后将它与最后内循环执行的总时间相乘