这是算法:我认为它的时间复杂度是O(nlogn),但我不确定
k=1;
while (k<=n) do
j=1;
while (j<=k) do
sum=sum+1;
j=j+1;
k=k*2;
答案 0 :(得分:5)
第一次内循环在第二次迭代时执行1次迭代。序列类似于1,2,4,8,16,32 ......只要它小于或等于n
。序列可能包含Θ(log(n))
个元素,但其总和为Θ(n)
。这是因为
1 + 2 + 4 + ... + 2 ^ k = 2 * 2 ^ k - 1
我们知道n/2 < 2^k <= n
。因此内循环执行Θ(n)
次
每个内循环执行需要恒定数量的指令。
其余代码只是log(n)
j = 1
的分配
log(n)
k
的双倍Θ(n)
。
因此算法的时间复杂度为{{1}}。
答案 1 :(得分:0)
// code | max times executed
k=1; | 1
while (k<=n) do | log n
j=1; | log n
while (j<=k) do | log n * n
sum=sum+1; | log n * n
j=j+1; | log n * n
k=k*2; | log n
所以O复杂度似乎是n log n。