int sum = 0;
for (int i = 1; i <= N; i = i*2)
for (int j = 1; j <= N; j = j*2)
for (int k = 1; k <= j; k++)
sum++;
根据解决方案,它是NlogN。但是,我认为这只是logN。 i
for循环迭代logN次,因为我每次迭代都加倍。 j
for循环与i
for循环相同,因此它也会迭代logN次。最后,k
for循环,因为它被设置为小于或等于j
,它将迭代相同的次数j
,因此,我们有另一个logN迭代。将三者相乘,我们得到logN * logN * logN总迭代次数或(logN)^ 3的复杂性。为什么我的思维过程不正确?
答案 0 :(得分:3)
sum++;
显然是O(1)
for (int k = 1; k <= j; k++)
sum++;
循环运行j
次,因此O(j)
for (int j = 1; j <= N; j = j*2)
for (int k = 1; k <= j; k++)
sum++;
所以这很棘手。我们知道内循环是O(j)
,但j
正在外循环中发生变化。你说:
最后,k for循环,因为它被设置为小于或等于j,它将迭代相同的次数j
没有。 j
循环按双精度计算。但内循环按增量计算。它们不会进行相同数量的迭代。
由于每个内循环都在O(j)时间运行,我们只需要在循环中每次都求和j。每次j
加倍,以便给我们:
1 + 2 + 4 + 8 + 16 + ... + n
此序列最终略低于2n。 (为什么留给读者作为一个例外。)因此它的O(n)
for (int i = 1; i <= N; i = i*2)
for (int j = 1; j <= N; j = j*2)
for (int k = 1; k <= j; k++)
sum++;
外部循环不与内部循环交互,并且运行log(N)
次给我们O(N log N)
答案 1 :(得分:0)
使用Sigma表示法,您可能会有条不紊地得到确切的公式: