【问题标题】:How would I go about analyzing the formal complexity of this algorithm under Big Theta Θ notation?我将如何在 Big Theta Θ 表示法下分析该算法的形式复杂性?
【发布时间】:2015-03-08 22:12:16
【问题描述】:

我需要一些帮助来理解使用Big Theta Θ 表示法的算法分析:

Big O 是比较函数最常用的渐近符号,尽管在许多情况下,Big O 可以用 Big Theta Θ 代替,以获得渐近更紧密的界限。 p>

我将如何逐步分析此算法?我知道最终答案是 ϴ(n²),但我看不出来。任何帮助将不胜感激。

为简单起见,您可以假设 n = 2k,对于某个正整数 k

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

【问题讨论】:

    标签: java algorithm complexity-theory


    【解决方案1】:

    让我们暂时忽略i = n * n这一事实,只考虑算法

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

    i = i/2 表示i 除以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 的第一个值。

    【讨论】:

    • 您已经证明它是 O(n^2),但要证明 Theta(n^2),您还必须证明运行时间(对于大 n)以 n 的倍数为界^2。这是相当明显的,因为第一次执行 j 循环它会循环 n^2 次。
    • @Anonymous 你是对的。我总是把 O、Theta 和 Omega 搞混。我现在就编辑。
    【解决方案2】:

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

    内部循环包含i 计算。如果你把它加起来,你会得到i + i/2 + i/4 + i/8 + i/16 + ... &lt;= 2 * i。 (&lt;= 因为我们使用的是整数除法,&lt;= 始终是真值)

    所以计算总数&lt;= i == 2 * n * n

    我们还可以看到&gt;= i = n*n的计算次数。因为它的上下边界是n*n2*n*n,所以它是Big Theta(n^2)

    【讨论】:

      【解决方案3】:
       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

      第三,(n2)/4

      因此将它们总结为n^2 + n^2/2 + n^2/4 + ....

      倾向于2n^2 = O(n^2),因为大 O 表示法只关心 n 的顺序

      【讨论】:

        【解决方案4】:

        计算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)
        

        【讨论】:

          猜你喜欢
          • 2022-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多