【问题标题】:What is order of complexity here?这里的复杂性顺序是什么?
【发布时间】:2020-05-11 19:55:18
【问题描述】:
for(int i = n; i > 0; i/=3){
for(int j = 0; j < i; j++){
System.out.println("Hello");
}
}
是O(n) 还是O(nlog n)?
外部循环将运行 log3 n 次 - 因为迭代器被常数 3 分解。
因此,外部循环将被调用 log3 n 次
属于O(nlog n)?
【问题讨论】:
标签:
algorithm
data-structures
time-complexity
complexity-theory
【解决方案1】:
这部分n + n/3 + n/9 + ..... = n/3 (1 + 1/2 + 1/3 + ....)不正确。
其实
n + n/3 + n/9 + ..... = n( 1 + 1/3 + 1/9 +...)
和1 + 1/3 + 1/9 + ... = a / (1-r) 其中a = 1 和r = 1/3
收敛到3/2。
因此复杂度为O(n*(3/2)) 或O(n)
实际上我会这样想:让我们假设外循环为您提供了您想要解决的问题的输入大小。
所以内部循环就像编写多个不同大小的 for 循环,如下所示:
for ( k = 1 to n )
for ( k = 1 to n/3 )
for ( k = 1 to n/9 )
....
如果您查看这些 for 循环,复杂性似乎会收敛到 O(n),因为 for 循环的数量取决于 n 并且是减少,但如果它是一些常数,例如 @987654334 @ 那就是O(n*k)