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

Moe*_*ini 1 algorithm big-o

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

for (int i = 2;i < n;i*=2)
    for(int j = i;j < m;j*=j)
       x++;
Run Code Online (Sandbox Code Playgroud)

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

a-z*_*a-z 6

O(lg(n) * lg(lg(m)))
Run Code Online (Sandbox Code Playgroud)

最多lg(n)用于外环和lg(lg(m))另一个用于外环.

编辑:更多帮助证明:

让我们改变变量:

nn = lg(n);
mm = lg(m);
Run Code Online (Sandbox Code Playgroud)

代码将变为:

for (int i = 1;i < nn;i++)
    for(int j = i;j < mm;j *= 2)
        x++;
Run Code Online (Sandbox Code Playgroud)

现在运行时将是O(nn * lg(mm)).

编辑(2):绑定可以变得更紧(因为我们j = i在第二个循环中,没有j = 1)

如果nn >= mm那么(x++) = theta(mm * lg(mm)) = theta(lg(m) * lg(lg(m)))

如果nn < mm 那么(x++) = theta(nn * lg(mm)) = theta(lg(n) * lg(lg(m)))

  • 你确定我们不能通过知道它使用`j = i`而不是`j = 1`来获得更严格的约束吗? (2认同)

Gum*_*mbo 5

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

2 X < Ñ
⇔日志2(2 X)<日志2(Ñ)
X <日志2(Ñ)

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

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

Ĵ 2 X <
⇔登录Ĵ(Ĵ 2 X)<日志Ĵ()
⇔2 X <日志Ĵ()
⇔日志2(2 X)<日志2(日志Ĵ())
X <日志2(log j(m))

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