其中n
是函数的输入可以是任何整数。
i = n, total = 0;
while (i > 0) {
for (j=0; j<i; j++)
for (k=0; k<i; k++)
total++;
i = i/4;
}
这个功能的时间复杂度是多少?
答案 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获得以下内容:*
非常感谢WolframAlpha。