如何计算这个算法的Big O?

时间:2011-11-30 15:18:46

标签: algorithm big-o

我想在下面的算法中计算x++的大O.

for (int i = 2;i < n;i*=2)
    for(int j = i;j < m;j*=j)
       x++;

我想了很多,但我无法解决它。我该如何解决?

3 个答案:

答案 0 :(得分:5)

显然,外部循环是O(log 2 n )),因为 i 加倍,每次迭代从2到 n 独家。所以:

  

2 x &lt; 名词
  ⇔log 2 (2 x )&lt;日志<子> 2 名词的)
  ⇔ x &lt;日志<子> 2 名词的)

因此它最多需要外部循环的log 2 n )迭代,直到i < n不再满足为止,因此O(log(名词的))。

内部有点棘手,因为外部循环的 i 的当前值用于初始化内部循环的 j 。此外, j 与每次迭代相乘(即 j 2 )。所以:

  

j 2 x &lt;
  ⇔日志 j j 2 x ) &LT;日志<子> Ĵ
  ⇔2 x &lt;日志<子> Ĵ
  ⇔log 2 (2 x )&lt;日志<子> 2 (日志<子> Ĵ ))
  ⇔ x &lt;日志<子> 2 (日志<子> Ĵ ))

因此它最多需要log 2 (log j m ))内循环的迭代直到条件j < m不再满足,因此O(log( m )))。如果我们忽略基数,我们可以估算O的总复杂度(log( n )·log(log( m )))。

答案 1 :(得分:1)

O(log(n) * log log(m))内部执行日志记录m次。

答案 2 :(得分:0)

我试图以有条不紊的方式推断出算法增长复杂度的顺序。不幸的是,我无法使用j在每次内循环迭代时变化。

尽管如此,我想出了一个具有常数因子k而不是j的公式。

根据我的建议,您的算法应如下所示:

for (int i = 2;i < n;i*=2)
    for(int j = i;j < m;j*=k)
       x++;

解决方案如下:

enter image description here

enter image description here

与此同时,我将尝试找到一个完全符合您最初问题的解决方案。