for(i=1; i<=n; i=i*2)
for(j=1; j<=n; j=j+i)
x++;
为什么这个O(n)的运行时间?不应该是O(log n)* O(n)= O(nlog n)?因为第一个循环有O(log n),第二个循环有O(n)吗?
抱歉,我是Big O分析的新手。
答案 0 :(得分:1)
复杂性实际上是O(n)
。观察内环在外环上是依赖(因为我们有j = j + i
),并且内环的每一次转动都不会贡献相同的量运行时间,因此仅仅将外循环的复杂性乘以内循环的复杂性以获得总运行时间是不合适的!
事实上,对于给定的i
,由于我们每回合j
增加i
,内循环的值为1, 1 + i, 1 + 2i, ...
,因此总共约n / i
{1}}可能的值。
由于外部循环只取值为2
(即1, 2, 4, ...
)的幂,我们有以下内容:
i No. of values the inner loop takes = n / i
------------------------------------------------------------
1 n / 1 = n / (2^0)
2 n / 2 = n / (2^1)
4 n / 4 = n / (2^2)
. .
. .
. .
2^⌊log(n)⌋ n / (2^⌊log(n)⌋)
因此,复杂性由下式给出:
n / (2^0) + n / (2^1) + n / (2^⌊log(n)⌋)
= n * ( 1 + 1/2 + 1/2^2 + ... + 1/2^⌊log(n)⌋)
= n * (2 - 1 / 2^(⌊log(n)⌋+1))
< 2n
= O(n)
答案 1 :(得分:0)
您可以使用Sigma表示法继续这样做:
答案 2 :(得分:-2)
是的,是O(nlogn)。 解释 - 就像在第一个循环中一样,你跳过每个第二个元素,并为你运行n次的每个元素。因此O(nlogn)