我将如何在BigThetaθ表示法下分析此算法的形式复杂性?

时间:2015-03-08 22:12:16

标签: java algorithm complexity-theory

我需要一些帮助来理解使用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;
 }

4 个答案:

答案 0 :(得分:3)

让我们忽略i = n * n一分钟的事实,只考虑算法

while(i > 0)
{
    for(int j=0; j<i; j++)
       { a++; }
    i=i/2;
}

i = i/2i除以2,四舍五入。在最坏的情况下,没有四舍五入。如果i2的强项,就会发生这种情况。我们假设i == 16。然后i的值为16, 8, 4, 2, 1for循环有i次迭代,因此a++;执行的总次数为16 + 8 + 4 + 2 + 1 = 31。通常,如果i2的强项,则a++;2i - 1次。从渐近的角度来看,复杂度因此在iO(i)中是线性的。

i == n^2以来,复杂性为O(n^2)

为了证明它是Theta(n ^ 2),我们必须证明运行时间总是大于n ^ 2的固定倍数。但在这种情况下,我们可以看到a++发生的次数超过n^2的1倍,因为n^2i的第一个值。

答案 1 :(得分:0)

基本上,外部循环控制i的值。每次循环通过时,i除以2。然后,循环的初始值为ii/2i/4 ......

内循环包含i次计算。总结一下,得到i + i/2 + i/4 + i/8 + i/16 + ... <= 2 * i。 (<=因为我们使用整数除法,它总是<=真值)

所以计算总数<= i == 2 * n * n

我们还可以看到计算次数>= i = n*n。由于n*n2*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/22*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)