因此,我一直在尝试查找下面显示的代码的时间复杂度。我知道第一个for循环会迭代'n'次,并且必须乘以第二个for循环的迭代才能找到大哦时间复杂度。但是,第二个for循环中的条件使我感到困惑。
public static void main(String[] args) {
int x = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j = j * 2) {
x = x + 1;
}
}
}
如果j
每次迭代都乘以2倍,则两个循环的时间复杂度将为O(nlog(n))
。但是由于j
基于i
的值而停止,因此我认为必须涉及求和规则。我对整体时间复杂度的最佳猜测是O(nlog^2(n)
?我是对还是错,为什么?
答案 0 :(得分:0)
O (log n )是j
上 last (最差)循环的成本,因此 O ( n log n )是上限边界。问题是它是否较少,因为平均成本较低。但事实并非如此:只有强凸函数会发生这种情况(请考虑一个简单的带有 i 迭代的内部循环,其中平均值只是一个常数乘以 n ),并且对数是凹的。所以毕竟只是 O ( n log n )。