Java 嵌套循环的时间复杂性 for(int i=1;i
我正在做一些练习,有人能帮我找出上述算法的Θ吗?我知道如果只是两个外部嵌套循环,时间复杂度应该是Θ(nlogn)。但我不知道如何对待if-else语句。非常感谢 执行外部循环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
log(n)
次,因为每次都将i的值加倍
然后执行内部循环n
次,最后一个内部循环在if语句中执行一次(ifi==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语句中执行一次(ifi==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 | |
} ---------- |
} |
} |
------------