这种算法的复杂性是否正确?

时间:2016-02-12 19:14:21

标签: algorithm

我试图弄清楚这些算法并计算出如下的复杂性,这是正确的吗?

for (i=1; i<2*n; i++) // runs 2n-1 times 
   for (j=1; j<=n; j*=3)// runs log n(base 3)
      for (k=n; k>=1; k--)// runs n times

复杂性:O(n ^ 2 log n)

int t=0;
for(int i=1; i<=n; i++) //runs n times
   for(int j=0; j*j<4*n; j++) //runs (2√n)
      for(int k=1; k*k<=9*n; k++) //runs (3√n)
         t++;

复杂性:O(n ^ 2)

int x=0;
for(int i=1; i<=n; i=i*3){  //runs 1, 3, 9, 27.. 
   if(i%2 != 0) // true for values above
      for(int j=0; j<i; j++) // runs n times
         x++;
 }

无法弄清楚这一个

请解释我是否错了。

2 个答案:

答案 0 :(得分:0)

int x=0;
for(int i=1; i<=n; i=i*3){  //log n
   if(i%2 != 0) // true for values above
      for(int j=0; j<i; j++) // runs n times
         x++;
 }

在这里,您可以看到第一个循环以O(log n)复杂度运行。并且内部运行直到in次,这表示n值是什么,j值的增量是常数,即{{1}字面意思是1。所以结合两者。根据主定理,内部O(n)和外部T(n),我们将复杂度定为T(logn)

答案 1 :(得分:0)

第一个循环的运行时间为O(log_3(n))if评论始终为真,因此第二次循环会一直运行到j<i(不是j<n)。

所以总运行时间如下:

1 + 3 + 9 + 27 + ... =Σ{i = 0到log_3(n)}(3 ^ i)==(3 * n-1)/ 2

  

所以复杂性是O(n)