内循环以j = 2开始时的时间复杂度

时间:2019-04-05 01:09:45

标签: c time-complexity

我得到O(n^2 logn)作为以下代码的输出。但是我不明白为什么?

int unknown(int n) {
    int i, j, k = 0;
    for (i = n / 2; i <= n; i++)
        for (j = 2; j <= n; j = j * 2)
            k = k + n / 2;
    return k;
}

1 个答案:

答案 0 :(得分:2)

固定不变的起点不会对内循环造成任何影响。

从2开始而不是1意味着迭代次数减少了一个,但是 ratio 仍然是对数。

想一想当您将n加倍时会发生什么。不管您是从一开始还是从两个开始,这都会为该循环增加一个迭代。因此,这是O(log N)的复杂性。

但是,您应该记住 outer 循环是O(N),因为迭代次数与N成正比。这样一来,整个函数就O(N log N),而不是您放置的O(N2 log N)