嵌套循环的时间复杂性

时间:2014-11-08 10:05:42

标签: java loops if-statement complexity-theory time-complexity

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语句。提前谢谢了!

1 个答案:

答案 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次到第二个最内循环的运行时间,然后将它与最后内循环执行的总时间相乘