【问题标题】:complexity for nested loops ratio 1/2 [duplicate]嵌套循环的复杂性比率 1/2 [重复]
【发布时间】:2013-06-02 22:40:41
【问题描述】:

我正在尝试使用大 O 表示法来计算 for 循环的复杂性。我以前在其他课程中也这样做过,但是这个比其他的更严格,因为它是在实际算法上的。代码如下:

for(i=n ; i>1 ; i/=2) //for any size n
{
    for(j = 1; j < i; j++)
    {
      x+=a
    }
}

指令 x+=a 总共执行了 n + n/2 + n/4 + ... + 1 次。

G.P. 的第一个 log2n 项的总和。起始项 n 和共同比率 1/2 为 (n (1-(1/2)log2n))/(1/2)。因此第一个代码片段的复杂度是 O(n)。

正确吗?

【问题讨论】:

  • 这似乎与您之前的问题相同。请不要发布重复的问题。谢谢!

标签: c complexity-theory big-o


【解决方案1】:

是的,你是对的。但是,您不需要为此使用对数,因为:

n + n/2 + n/4 + ... + 1 = 2*n - 1

(这个等式对于 n 是 2 的幂是精确的,对于非 2 的幂则略微偏离)

更新:证明。

让我们调用我们的总和x

x = n + n/2 + n/4 + ... + 1

另外,为简单起见,假设 n 是 2 的幂,因此所有成员都可以被 2 的幂整除而没有余数。

如果你将x 乘以2,你会看到一些非常有趣的东西:

2*x = 2*n + 2*(n/2) + 2*(n/4) + ... + 2

或者,您可以将其重写为:

2*x = 2*n + x - 1

可以简化为:

x = 2*n - 1

【讨论】:

  • 更新答案以添加正式证明
  • 这个 2*n - 1 仅用于所有内部和第一个循环的第一个循环矿石
  • 2*n-1 是行x+=a 将执行多少次
  • 这意味着这个问题的复杂度是 2*n-1 = o(n) ?
  • 当然。 O(2*n) 的复杂度被认为与 O(n) 相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
相关资源
最近更新 更多