【问题标题】:Calculating algorithm complexity of 1 2 4 8 pattern计算 1 2 4 8 模式的算法复杂度
【发布时间】:2012-05-27 02:04:15
【问题描述】:

我需要计算一下这个算法的复杂度:

f=1;
x=2;

for(int i=1;i<=n;i*=2)
   for(int j=1;j<=i*i;j++)   
      if(j%i==0)
         for(int k=1;k<=j*i;k++)
             f=x*f;

我找出了内循环的模式和总和,即 i^2(i(i+1)/2) 但我无法得到 (1 2 4 8 16 ...) 系列中这种模式的总和

那么,我怎样才能找到这个系列的总和呢?

【问题讨论】:

    标签: algorithm complexity-theory


    【解决方案1】:

    我不会为你解决这个问题(这看起来像是家庭作业)。但这里有一个简化问题的提示。

    这段代码:

    for(int j=1; j<=i*i; j++)   
        if(j%i==0)
            // ... blah ...
    

    等价于这段代码:

    for(int j=i; j<=i*i; j += i)
        // ... blah ...
    

    【讨论】:

    • 感谢您的关注.. 我明白你的意思.. 我的问题在于数学公式,我可以使用以下形式对一系列形式求和:1 4 8 16 32 48 64 64 128 192 256 320 384 448 512 其中n = 8 ...正如我所说,我将内部级数的公式计算为n ^ 2(n(n + 1)/ 2),但我需要外部级数..
    【解决方案2】:

    外部for(int i=1;i&lt;=n;i*=2)的另一个提示:每次执行for循环体后,i乘以2:

    1 · 2 · 2 · … · 2

    只要条件为真,就会重复:

    1 · 2 · 2 · … · 2 ≤ n

    我们也可以将 2 的重复乘法写成如下:

    2 · 2 · … · 2 = 2xn

    i乘以2的次数,i。 e. x,可以用logarithm 以 2 为底计算,即。 e.日志2(n):

    2xn

    x = log2(n) 实际上是相等的:

    2log2(n) = n

    因此for 条件是 floor(log2(n)) 次真,所以它的复杂度是 Ο(log(n))、Ω(log(n)),因此 θ(log(n))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多