我需要一些帮助来理解使用Big Theta Θ表示法的算法分析:
Big O 是比较函数最常用的渐近符号,尽管在很多情况下Big O 可能会被BigThetaΘ替换为渐近更紧的边界。
我将如何逐步分析此算法?我知道最后的答案是Θ( n ²),但我很难看到它。任何帮助将不胜感激。
为简单起见,您可以假设 n = 2 k ,对于某些正整数 k 。
int a = 0;
int i = n * n;
while (i > 0) {
for (int j = 0; j < i; j++) {
a++;
}
i = i/2;
}
答案 0 :(得分:3)
让我们忽略i = n * n
一分钟的事实,只考虑算法
while(i > 0)
{
for(int j=0; j<i; j++)
{ a++; }
i=i/2;
}
i = i/2
说i
除以2
,四舍五入。在最坏的情况下,没有四舍五入。如果i
是2
的强项,就会发生这种情况。我们假设i == 16
。然后i
的值为16, 8, 4, 2, 1
。 for
循环有i
次迭代,因此a++;
执行的总次数为16 + 8 + 4 + 2 + 1 = 31
。通常,如果i
是2
的强项,则a++;
会2i - 1
次。从渐近的角度来看,复杂度因此在i
或O(i)
中是线性的。
自i == n^2
以来,复杂性为O(n^2)
。
为了证明它是Theta(n ^ 2),我们必须证明运行时间总是大于n ^ 2的固定倍数。但在这种情况下,我们可以看到a++
发生的次数超过n^2
的1倍,因为n^2
是i
的第一个值。
答案 1 :(得分:0)
基本上,外部循环控制i
的值。每次循环通过时,i
除以2。然后,循环的初始值为i
,i/2
,i/4
......
内循环包含i
次计算。总结一下,得到i + i/2 + i/4 + i/8 + i/16 + ... <= 2 * i
。 (<=
因为我们使用整数除法,它总是<=
真值)
所以计算总数<= i == 2 * n * n
。
我们还可以看到计算次数>= i = n*n
。由于n*n
和2*n*n
位于上方和下方,因此Big Theta(n^2)
答案 2 :(得分:0)
int a = 0, i=n*n;
while(i > 0)
{
for(int j=0; j<i; j++)
{ a++; }
i=i/2;
}
您执行for循环的次数是多少次:
第一次通过while循环,i = n^2
第二次,i/2 = (n2)/2
3,(n2)/4
因此将它们相加得出n^2 + n^2/2 + n^2/4 + ....
倾向于2n^2 = O(n^2)
,因为Big O表示法只关注n
答案 3 :(得分:0)
计算a
增加的次数:
n^2 on the first iteration
+
n^2 / 2 on the second iteration
+
...
+
n^2 / 2^k on the (k+1)-th iteration
我们有k = log(n^2) = 2*log(n)
,因为我们在每一步都除以2
。
因此,我们得到几何级数与第一项n^2
,比率1/2
和2*log(n)
项的总和,或者使事情变得更容易,第一项1
和比率2
:
S = O(2^(2*log(n))) = O([2^log(n)]^2) = O(n^2)
=> The entire algorithm is BigTheta(n^2)