我想概括一下我们如何获得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
所以我对引述/突出显示的事实正确吗?