下面方法的时间复杂度是什么?为什么?
我知道它必须大于O(n),因为第一个for循环。
但是在while循环之后时间复杂度会发生什么变化?
是O(n)(n-1)= O(n ^ 2 + n)?
int fnA(int n) {
int sum=0;
for (int i=0; i<n; i++) {
int j=i;
int product =1;
while (j>1) {
product ∗= j ;
j = j / 2;
}
sum += product;
}
return sum;
}
答案 0 :(得分:1)
对我来说这看起来像O(n log n)
。主循环迭代n
次,每次迭代需要log n
次迭代才能完成,因为j
从i
开始,并且在j <= 1
之前减半。如果你想象内循环的所有迭代的总时间,你会得到以下总和。
O(0 log n) + O(1 log(n-1)) + ... + O(n/2 log (n/2)) + ... + O((n-2) log 2) + O((n-1) log 1) =
O(log n) + O(n log n) + O(n) =
O(n log n)