我试图找到这种算法的复杂性:
m=0;
i=1;
while (i<=n)
{
i=i*2;
for (j=1;j<=(long int)(log10(i)/log10(2));j++)
for (k=1;k<=j;k++)
m++;
}
我认为它是O(log(n)* log(log(n))* log(log(n))):
因此O(log(n)* log(log(n))* log(log(n)))。
答案 0 :(得分:3)
时间复杂度是Theta(log(n)^ 3)。
设T = floor(log_2(n))。您的代码可以重写为:
int m = 0;
for (int i = 0; i <= T; i++)
for (int j = 1; j <= i+1; j++)
for (int k = 1; k <= j; k++)
m++;
这显然是Theta(T ^ 3)。
编辑:这是重写代码的中间步骤。设a = log_2(i)。 a总是一个整数,因为我是2的幂。那么你的代码显然等同于:
m=0;
a=0;
while (a<=log_2(n))
{
a+=1;
for (j=1;j<=a;j++)
for (k=1;k<=j;k++)
m++;
}
我做的其他更改是将楼层(log_2(n))命名为T,a命名为i,并使用for循环而不是一段时间。
希望现在很清楚。
答案 1 :(得分:1)
这是家庭作业吗?
一些提示:
我不确定代码是否正在做它应该做的事情。 log10返回一个浮点值,而转换为(long int)可能会减少.9999999999。我认为这不是故意的。该行应该看起来像那样:
for (j=1;j<=(long int)(log10(i)/log10(2)+0.5);j++)
在这种情况下,您可以将其重写为:
m=0;
for (i=1, a=1; i<=n; i=i*2, a++)
for (j=1; j<=a; j++)
for (k=1; k<=j; k++)
m++;
因此,你对'j'和'k'循环的复杂性假设是错误的 (外部循环运行log n次,但我增加到n,而不是log n)