这个等式的大O?

时间:2012-01-11 07:43:37

标签: complexity-theory big-o nested-loops

 for (int j=0,k=0; j<n; j++)
   for (double m=1; m<n; m*=2)
      k++;

我认为这是O(n ^ 2),但我不确定。我正在研究练习题,我有以下选择:

  • 为O(n ^ 2)
  • O(2 ^ n)的
  • O(N!)
  • O(n log(n))

4 个答案:

答案 0 :(得分:5)

嗯......好吧,把它分解。

外环似乎很明显是O(n)。每次迭代增加1。 然而,内环增加了2的幂。指数当然与对数相关(实际上是相反的)。

为什么要来O(n ^ 2)解决方案?证明它。

答案 1 :(得分:3)

O(nlog 2 n)。代码块运行n * log 2 n次。

假设n=16;然后第一个循环运行16(= n)次。第二个循环运行4(= log 2 n)次(m = 1,2,4,8)。所以内部语句k++运行64次=(n * log 2 n)次。

答案 2 :(得分:2)

让我们看一下最坏的情况。对于第二次循环搜索从1,2,4,8继续....假设对于某些k> = 0,n是2 ^ k。在最坏的情况下,我们可能最终搜索直到2 ^ k并且意识到我们超过了目标。现在我们知道目标可以是2 ^(k - 1)和2 ^ k。该范围内的元素数量为2 ^(k - 1)(想想一秒)。到目前为止我们检查的元素数量是O(k),它是O(logn),对于第一个循环,它是O(n)。(太容易找到)。那么整个代码的顺序就是O(n(logn))。

答案 3 :(得分:1)

解决这些问题的一般方法是考虑每个循环的顺序,并且因为它们是嵌套的,所以可以乘以“O”符号。

大“O”的一些简单规则:

  1. O(n)O(m) = O(nm)
  2. O(n) + O(m) = O(n + m)
  3. O(kn) = O(n)其中'k'是常量
  4. 'j'循环迭代n个元素,所以很明显它是O(n)。 'm'循环遍历log(n)元素,因此它是O(log(n))。

    由于循环是嵌套的,我们的最终结果是O(n) * O(log(n)) = O(n*log(n))