给定代码的渐近分析

bas*_*sil 3 algorithm big-o computer-science asymptotic-complexity

我得到了以下伪代码:

 j = 1
 while j < n:
      k = 2
      while k < n:
           k = k*k
      j++
Run Code Online (Sandbox Code Playgroud)

在我的想法中,这段伪代码将具有以下复杂性:

 O(n*log(n))
Run Code Online (Sandbox Code Playgroud)

由于外循环执行n次.虽然内循环基本上每次将增量步长分成两半.我的想法太远了吗?

编辑:1个以上(这些不是作业,我保证,只是要了解的例子)

 for i = 1 to n:
    for j = 1 to n:
       k = j*j
       while k < n:
          k++
Run Code Online (Sandbox Code Playgroud)

在这种情况下,最外面的循环将执行n次.中间回路也将执行n次,把我们现在以n 2倍.最里面的循环,正如我所说,它将执行log(n)次,将我们放在O(n 2*log(n))次.我的理解是否正确?

Gas*_*ssa 6

是的O (n log log n).

n就时间而言,外循环只重复内循环次数,因此它可以提供乘数n.

内环更棘手,它重复平方k.看看它是怎么回事: 2^1 -> 2^2 -> 2^4 -> 2^8 -> 2^16 -> 2^32 -> ... 所以,例如,如果n = 2^32,循环将有5迭代.在这里,log_2 (n)32,log_2 (32)5.

通常,如果n = 2^(2^r),内循环将在迭代n之后到达r.通过取对数,我们到达log n = 2^r.通过另一次取对数,我们得到了log log n = r.正如您可能知道的那样,对数的基数在处理渐近行为时并不重要,只要它是常数即可.

因此,我们有n一个循环的log log n迭代,它本身会进行迭代,从而产生整体复杂性O (n log log n).