【问题标题】:How to compute the complexity of this?如何计算这个的复杂度?
【发布时间】:2014-09-15 07:10:20
【问题描述】:
int foo(int n)
{
    int sum = 0;
    for(int k=1; k <= n; k = k * 2) 
    {
        sum += k;
    }
    return sum;
}

我有以下功能。 现在,根据我的说法,foo(n) 的运行时复杂度应该是 big-o(logn)。 现在,我被要求找出 foo(n*n*n*n) 的运行时间复杂度。应该是什么? 根据我的说法,应该是 big-o(logn) 而已。 我这样说对吗?

【问题讨论】:

  • 我被要求找出 foo(nnn*n) 的运行时间复杂度。这是什么意思?
  • 什么是不投票的问题,我不明白?
  • 没有理由投反对票,+1。

标签: c algorithm complexity-theory


【解决方案1】:

是 O(log n4) → O(4 log n) → O(log n)

【讨论】:

  • 是的,我就是这样做的。谢谢。 :)
【解决方案2】:

问问自己,循环执行了多少次?当输入为n时为循环创建表:

for(int k=1; k <= n; k = k * 2)

  Iteration  |  k 
-------------+-----
      1      |  1
      2      |  2
      3      |  4
     ...     | ...
     ...     | ...
      k      |  n

2k = n → k = log(n)

现在您要求 n4 输入。只需将表格更改为:

  Iteration  |  k 
-------------+-----
      1      |  1
      2      |  2
      3      |  4
     ...     | ...
     ...     | ...
      k      | n^4

2k = n4 → k = log(n4) = 4 * log(n)

【讨论】:

  • @PaulR 我给 OP 一个方向,而不是一个完整的解决方案。我认为我的例子应该引导他找到答案。
  • 他已经解决了这部分问题 - 请仔细阅读整个问题。
  • 我认为是 8 对应于 3。但是,对于 n^4 也将是 big-o(logn),对吧?
  • 现在一切都好 - 投赞成票 - 有时最简单的问题可能是最繁琐的! ;-)
  • 请注意迭代i后k的值实际上是2^(i-1)。因此,如果在 i 次迭代后 k 等于 n,则循环运行 i 次,这就是代码的复杂性。 2^(i-1) = n,现在你可以为 i 解决这个问题了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
相关资源
最近更新 更多