有助于发现此算法的复杂性

时间:2010-08-27 09:07:27

标签: algorithm complexity-theory

我试图找到这种算法的复杂性:

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))):

  • 'i'循环运行直到i = log(n)
  • 'j'循环运行,直到log(i)表示log(log(n))
  • 'k'循环运行直到k = j - > k = log(i) - &gt; K =日志(日志(n))的

因此O(log(n)* log(log(n))* log(log(n)))。

2 个答案:

答案 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)