我试图找出嵌套的for循环的运行时复杂性

时间:2019-02-24 02:05:35

标签: c++ big-o

所以我在想的答案是 O(log(n)),因为for嵌套的for循环 x 是double和 y double (log(n)* log(n))=(log ^ 2(n))给出 log(n)

我想的第二种方式是,因为外部和内部for循环都会将其变量加倍,所以合并的运行时就是 O(n) 而且我不确定while循环是否会在“最终答案”中发挥作用,因为它只是添加了 log(n)

for(x=1; x<n; x = x*2)
 {
   for(y=1; y<n; y=y*2)
   {
      a += (array[y]-array[x]);
   }
 }
 i = n;
 while(i>0) 
  {
     a += array[i];
     i = i/2;
  }
  return a;

2 个答案:

答案 0 :(得分:0)

这是一个提示。

稍微修改一下代码,以计算任何给定值N的内循环迭代次数。类似以下内容:

unsigned long test1(unsigned long n)
{
    unsigned long x, y;
    int iterations = 0;

    for (x = 1; x < n; x = x * 2) {
        for (y = 1; y < n; y = y * 2) {
            iterations++;
        }
    }

    unsigned long i = n;
    while (i > 0) {
        iterations++;
        i = i / 2;
    }
    return iterations;
}

现在运行它:

1,1
2,3
4,7
8,13
16,21
32,31
64,43
128,57
256,73
512,91
1024,111
2048,133
4096,157
8192,183
16384,211
32768,241
65536,273
131072,307
262144,343
524288,381
1048576,421
2097152,463
4194304,507
8388608,553
16777216,601
33554432,651
67108864,703

现在让我们使用Excel对其进行绘制。上面生成的相同的“ x”值呈指数增长,但我们仍使用线性的x和y轴对其进行绘制。

enter image description here

问问自己-是像y=Ny=lg(n)的图形吗?

答案 1 :(得分:0)

log(n)*log(n)(即log²(n))为O(log(n))需要存在常量 c n 0 这样对于任何 n> n 0 ,不等式log(n)*log(n) <= c*log(n)为真;但是,对数不受限制地增长,因此很明显,这样的常量不可能存在。

我想您将log²(n)log(n²)混为一谈;后者实际上是O(log(n)),因为适当的常数是2(任何大的值也可以),因为log(n²)在数学上等效于2*log(n)

继续selbiework

       n, ld(n), f(n), 2*ld²(n)

       1,     0,    1,        0
       2,     1,    3,        2
       4,     2,    7,        8
       8,     3,   13,       18
      16,     4,   21,       32
      32,     5,   31,       50
      64,     6,   43,       72
     128,     7,   57,       98
     256,     8,   73,      128
     512,     9,   91,      162
    1024,    10,  111,      200
    2048,    11,  133,      242
    4096,    12,  157,      288
    8192,    13,  183,      338
   16384,    14,  211,      392
   32768,    15,  241,      450
   65536,    16,  273,      512
  131072,    17,  307,      578
  262144,    18,  343,      648
  524288,    19,  381,      722
 1048576,    20,  421,      800
 2097152,    21,  463,      882
 4194304,    22,  507,      968
 8388608,    23,  553,     1058
16777216,    24,  601,     1152
33554432,    25,  651,     1250

扩展表也应该很好地说明您的循环是O(log²(n)),而不是O(log(n))

旁注:至少对于2的幂f(n)ld²(n) + ld(n) + 1 ...