【问题标题】:Calculating Time Complexity(input divisible by 2)计算时间复杂度(输入可被 2 整除)
【发布时间】:2013-09-13 05:43:13
【问题描述】:

如何计算这部分代码的时间复杂度或 T(n)?

j=1;
while(j<=n/2){
   i=1;
   while(i<=j){
      cout<<j<<i;
      i++;
   }
   j++
}

我认为你可以假设 n 可以被 2 整除。

【问题讨论】:

    标签: performance algorithm time complexity-theory


    【解决方案1】:

    计算总迭代次数并不难。 j 的范围是 j=1, 2, ..., n/2。对于 j 的每个值,i 的范围是 i = 1, 2, ..., j。因此,对于外部循环的每个值,内部循环都有 j 次迭代。这意味着总的迭代次数是:

    T(n) = 1 + 2 + 3 + ... + n/2 = (1/2)(n/2)(n/2+1) = (1/8)(n^2 + 2n)。

    [注意:我在这里使用恒等式 1 + 2 + ... + k = k(k+1)/2。]

    如前所述,这个函数是 O(n^2)。

    【讨论】:

      【解决方案2】:
      while(j<=n/2){            |      n/2+1
         i=1;                   |      n/2
         while(i<=j){           |      1+n/2(n/2+1)/2 =1+n(n+1)/8
            cout<<j<<i;         |      n(n+1)/8
            i++;                |      n(n+1)/8
         }                      |
         j++                    |      n/2
      }                         |
      

      总体:O(n2)

      【讨论】:

        【解决方案3】:

        除以常数不会改变O(...)。确切的可分性也不重要。就像j 一直到n 的算法一样,这是一个O(N^2) 算法。

        【讨论】:

        • 这会影响 T(n) 吗?
        • @blakepeterman 你的意思是除以常数吗?不,它不会:一个循环占整个列表长度的一半(或十分之一,无论如何)是O(n),除非除数取决于n(在这种情况下它不再是一个常数)。
        • 这个问题是专门询问 T(n) 的,它通常是指特定的时间函数(输入大小 n 的操作数)。这通常是导致谈论 O(T(n)) 的教育步骤。
        猜你喜欢
        • 2021-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 2017-09-25
        相关资源
        最近更新 更多