嵌套循环的复杂性,外环变量减少了每次迭代的一半

时间:2016-09-16 13:25:07

标签: algorithm big-o

void G(....) 
{
  for ( int k = n/2; k > 0; k /= 2 ) 
  { 
    for ( int m = 0; m < n; m++) 
      a[(k+m)%n]=k+m;
  }                      
}

当循环启动器和增量分别为(n/2)(k/=2)时,我不确定如何计算循环操作等等。在编译器上针对不同的n值运行此代码给出了有趣的结果,例如,如果n是2 ^ x,则对于n的值,迭代是n * x,直到2 ^(x + 1)-1。现在我陷入困境,并且不知道哪个Big Oh函数将其归类为。欢迎任何答案/反馈/建议的学习方法/解释!

1 个答案:

答案 0 :(得分:2)

外循环运行 k = n / 2,n / 4,n / 8,...,*。 它总共运行Θ(log(n))次 - 这是通过连续除2将 n / 2 减少到1所需的顺序。

对于 k 的每个值,无论值如何,内部循环运行 n 次,因此内部循环+主体在Θ(n)中运行)时间。

由于内循环+主体占用的时间与外循环的值无关,因此我们需要将外循环运行的次数乘以内循环+主体的运行时间。这是Θ(n log(n))