我得到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;
}
答案 0 :(得分:2)
固定不变的起点不会对内循环造成任何影响。
从2开始而不是1意味着迭代次数减少了一个,但是 ratio 仍然是对数。
想一想当您将n
加倍时会发生什么。不管您是从一开始还是从两个开始,这都会为该循环增加一个迭代。因此,这是O(log N)
的复杂性。
但是,您应该记住 outer 循环是O(N)
,因为迭代次数与N
成正比。这样一来,整个函数就O(N log N)
,而不是您放置的O(N2 log N)
。