推广O(log log n)时间复杂度

时间:2020-01-04 11:20:33

标签: algorithm time time-complexity complexity-theory

我想概括一下我们如何获得O(log log n)的时间复杂度。 昨天我问了一个this问题,这是我知道的:

for(i=1 ; i<n ; i*=2) { ... }

导致O(log n)时间复杂度。通过在每次迭代中乘以2,我们实际上就获得了2的下一个幂:

For O(log n)
   i=i*2
============
  1*2 = 2^1 = 2
  2*2 = 2^2 = 4
  4*2 = 2^3 = 8
 and so on

因此,为了获得O(log log n)的时间复杂度,我需要采用下一个双倍功效(为了方便起见,我将这个术语称为“双倍功效”),

For O(log log n)
   i=i*2
================
 2^(2^1) = 4
 2^(2^2) = 16
 2^(2^3) = 256
 and so on

我想这可以通过以下循环来实现(如果错误,请纠正我):

for(i=1,j=0; i<=n; i=2^(2^j)) { ... }

如果我们不必在代码中使用幂函数并通过乘法模仿相同的函数,那么我们可以进行平方运算以达到相同的时间复杂度:

For O(log log n)
   i=i*i
================
 2*2 = 2^(2^1) = 4
 4*4 = 2^(2^2) = (2^2)^2 = 4^2 = 16
 16*16 = 2^(2^3) = ((2^2)^2)^2 = 16^2 = 256
 and so on

这可以通过以下循环来模仿:

for(i=2; i<=n; i*=i) { ... }

(让我知道是否可以通过其他方法将循环控制变量乘以O(log log n),而不提高其幂次)。

我的主要疑问是我们如何概括这一点?

(到目前为止,所有log的基础都是2,从现在开始,我将明确地声明为log_2

我感到每次迭代中的平方环计数器给了我们O(log_2 log_2 n)。因此,在每次迭代中使用第k次循环计数器的幂将为我们提供O(log_k log_k n)

例如,下面的循环将给我们O(log_3 log_3 n)

for(i=3; i<=n; i*=i*i) { ... }

我试图通过如下准备表格来验证这一点:

For O(log log n)
   i*=i*i
================
 3*3*3 = 3^(3^1) = 27
 27*27*27 = 3^(3^2) = (3^3)^3 = 27^3 = 19683
            3^(3^3) = ((3^3)^3)^3 = 19683^3
 and so on

所以我对引述/突出显示的事实正确吗?

0 个答案:

没有答案