这会是什么时候复杂,为什么?

时间:2016-05-06 14:28:51

标签: time-complexity big-o

下面方法的时间复杂度是什么?为什么?

我知道它必须大于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;
}

1 个答案:

答案 0 :(得分:1)

对我来说这看起来像O(n log n)。主循环迭代n次,每次迭代需要log n次迭代才能完成,因为ji开始,并且在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)