Java 嵌套循环的时间复杂性 for(int i=1;i

Java 嵌套循环的时间复杂性 for(int i=1;i,java,loops,if-statement,complexity-theory,time-complexity,Java,Loops,If Statement,Complexity Theory,Time Complexity,我正在做一些练习,有人能帮我找出上述算法的Θ吗?我知道如果只是两个外部嵌套循环,时间复杂度应该是Θ(nlogn)。但我不知道如何对待if-else语句。非常感谢 执行外部循环log(n)次,因为每次都将i的值加倍 然后执行内部循环n次,最后一个内部循环在if语句中执行一次(ifi==j保持)n次,这样整个内部循环每次都需要n+n步数 这为您提供了一个O(2n log(n))的上限,并且由于常数不会改变渐近复杂性,因此运行时以O(n log(n)) for(int i=1;i

我正在做一些练习,有人能帮我找出上述算法的Θ吗?我知道如果只是两个外部嵌套循环,时间复杂度应该是Θ(nlogn)。但我不知道如何对待if-else语句。非常感谢

执行外部循环
log(n)
次,因为每次都将i的值加倍

然后执行内部循环
n
次,最后一个内部循环在if语句中执行一次(if
i==j
保持)
n
次,这样整个内部循环每次都需要
n+n
步数

这为您提供了一个
O(2n log(n))
的上限,并且由于常数不会改变渐近复杂性,因此运行时以
O(n log(n))

for(int i=1;i

请注意,most内部循环每秒仅执行一次most内部循环(!),并且由于第二个内部循环执行
log n
次(具有
n
步数)我们必须将最内部循环的
n
次数添加到第二个最内部循环的运行时,然后将其与第二个最内部循环执行的总时间相乘,因为每次执行外部循环的
log(n)
次数都是i的两倍

然后执行内部循环
n
次,最后一个内部循环在if语句中执行一次(if
i==j
保持)
n
次,这样整个内部循环每次都需要
n+n
步数

这为您提供了一个
O(2n log(n))
的上限,并且由于常数不会改变渐近复杂性,因此运行时以
O(n log(n))

for(int i=1;i


请注意,most内部循环每秒仅执行一次most内部循环(!),并且由于第二个内部循环执行
log n
次(具有
n
步数)我们必须将最内部循环的
n
次数添加到第二个最内部循环的运行时,然后将其与第二个最内部循环执行的总时间相乘

提示1:
i==j
在这个循环中有多少次?提示2:你能把最里面的循环从中间的循环中提出来,这样程序就更容易分析了吗?谢谢。我一直在思考I==j有多少次,但没有结论。@matheburg通常认为比较和分支需要O(1)个时间。@Iarsman抱歉-我完全忽略了内部循环!:所以,忘了我愚蠢的注释提示1:
i==j
在这个循环中有多少次?提示2:你能把最里面的循环从中间的循环中提出来,这样程序就更容易分析了吗?谢谢。我一直在思考I==j有多少次,但没有结论。@matheburg通常认为比较和分支需要O(1)个时间。@Iarsman抱歉-我完全忽略了内部循环!:所以,忘了我愚蠢的评论吧,为什么最内部的循环被执行了n次?我不知道它应该运行多少次,但我猜I==j不会发生n次?没错,它只得到executet一次,但循环本身有n个步骤。例如,当n=16时,最内部的循环在I=j=2,4和16时执行,这不是一次而是3次对吗?@Stillafanofthesimpson实际上对于n=16,I==j对于1,2,4,8,对于一般的n,i==j表示i的O(log(n))值。在执行j循环期间,条件i==j仅为真一次,此时执行n次循环。对于j循环,有n-1次迭代(基本常数时间)+1次运行n循环。然后大概是2n。为什么最内部的循环执行了n次?我不知道它应该运行多少次,但我猜I==j不会发生n次?没错,它只得到executet一次,但循环本身有n个步骤。例如,当n=16时,最内部的循环在I=j=2,4和16时执行,这不是一次而是3次对吗?@Stillafanofthesimpson实际上对于n=16,I==j对于1,2,4,8,对于一般的n,i==j,表示执行过程中i的O(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
            }
         }else{
            // Do another elementary thing
         }
     }
 }
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            |            |
     }                                  ----------             |
 }                                                             |
}                                                              |
                                                   ------------