我想在下面的算法中计算x++
的大O.
for (int i = 2;i < n;i*=2)
for(int j = i;j < m;j*=j)
x++;
我想了很多,但我无法解决它。我该如何解决?
答案 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++;
解决方案如下:
与此同时,我将尝试找到一个完全符合您最初问题的解决方案。