循环的运行时间呈指数衰减?

时间:2013-10-10 17:33:12

标签: algorithm math big-o asymptotic-complexity recurrence

其中n是函数的输入可以是任何整数。

i = n, total = 0; 
while (i > 0) {      
 for (j=0; j<i; j++) 
   for (k=0; k<i; k++) 
     total++;      
 i = i/4; 
} 

这个功能的时间复杂度是多少?

3 个答案:

答案 0 :(得分:5)

考虑这个问题的一种方法是独立查看循环。

这个内循环嵌套:

for (j=0; j<i; j++) 
   for (k=0; k<i; k++) 
     total++;

将执行总共Θ(i 2 )运算,因为每个循环独立运行i次。

现在,让我们看一下外循环:

while (i > 0) {      
    /* do Theta(i^2) work */   
    i = i/4; 
} 

这个循环总共最多运行1 + log 4 i次,因为在每次迭代时我被减少1/4,这只能发生1 + log < sub> 4 i次,然后我降到零。那么,问题是将完成多少工作。

解决此问题的一种方法是为完成的总工作编写一个简单的递归关系。我们可以将循环视为尾递归函数,其中每次迭代都执行Θ(i 2 ),然后对大小为4的子问题进行递归调用。这会导致这种情况发生:

  

T(n)= T(n / 4)+Θ(n 2 )。

应用主定理,我们看到a = 1,b = 4,c = 2.由于log b a = log 4 1 = 0和0 &LT; c,运行时求解为Θ的Master Theorem says (by Case 3)(n 2 )。因此,完成的总工作是Θ(n 2 )。

这是考虑这一点的另一种方式。循环的第一次迭代确实n 2 工作。接下来做(n / 4) 2 = n 2 / 16工作。接下来做(n / 64) 2 = n 2 / 256工作。实际上,循环的迭代x将执行n 2 / 16 x 工作。因此,完成的总工作由

给出
  

n 2 (1 + 1/16 + 1/16 2 + 1/16 3 + ...)

     

≤n 2 (1 /(1 - 1/16))

     

=Θ(n 2

(这使用sum of an infinite geometric series)的公式。

希望这有帮助!

答案 1 :(得分:3)

运行时间为O(n^2)total递增的次数渐近n^2/(1-1/16),约为1.067 n^2。 复发将是

T(n) = n^2 + T(n/4)
     = n^2 + n^2/16 + T(n/16)
     = n^2 (1 + 1/16 + 1/16^2 + ...)
     = n^2 / (1 - 1/16)

答案 2 :(得分:0)

此代码片段:

i = n, total = 0; 
while (i > 0) {      
 for (j=0; j<i; j++) 
   for (k=0; k<i; k++) 
     total++;      
 i = i/4; 
}

相当于这一个:

for ( i = n ; i > 0 ; i = i / 4 )
    for ( j = 0 ; j < i ; j ++) 
        for ( k = 0 ; k < i ; k ++)
            total ++;

因此,有条理地(根据经验验证),您可以使用Sigma Notation获得以下内容:*

enter image description here

非常感谢WolframAlpha