Algorithm 循环计数器减半两次时的时间复杂度

Algorithm 循环计数器减半两次时的时间复杂度,algorithm,time-complexity,Algorithm,Time Complexity,我知道将循环计数器减半的时间复杂度是logn。也就是说,如果我们有以下循环: for(i=1 ; i<n ; i*=2) { ... } 时间复杂度是否为log n 我尝试了n的一些值: n = 2^8 = 256 i = 1,4,16,64,256 (5 times) n = 2^10 = 1024 i = 1,4,16,64,256,1024 (6 times) n = 2^16 = 65536 i = 1,4,16,64,256,1024,4096,16384,65536 (9

我知道将循环计数器减半的时间复杂度是
logn
。也就是说,如果我们有以下循环:

for(i=1 ; i<n ; i*=2) { ... }
时间复杂度是否为log n

我尝试了
n
的一些值:

n = 2^8 = 256
i = 1,4,16,64,256 (5 times)

n = 2^10 = 1024
i = 1,4,16,64,256,1024 (6 times)

n = 2^16 = 65536
i = 1,4,16,64,256,1024,4096,16384,65536 (9 times)
循环体似乎执行了
(logn)/2-1次。

我的分析正确吗?将循环计数器减半两次确实仍然会给出
O(log n)
时间复杂度,而不是
O(log log n)
时间复杂度?

你忘记了基数。在第一种情况下,我们假设基数为2,因此我们只将复杂性写为
O(logn)


在第二种情况下,基数应该是4,因为我们要乘以4,所以它应该是O(log4n)对,这就是为什么我们说
O(logn)
,而不仅仅是
logn
。顺便说一句,对于实际日志n,您必须使用
*e
或类似的东西进行循环

如果您使用
*4
循环,它将只快两倍,并且仍然
O(log n)

为了获得O(log n),您必须每次更改您的增加值:

i*=2
i*=4 (= 2*2)
i*=16 (= 4*4)
i*=256 (= 16*16)
etc

问题1。改变增长背后的直觉是什么。我开始知道,如果我做了
I=I^2
我会得到
O(logn)
时间复杂度。变化的增量与此相比如何?对于Q1-在每个步骤
m
上,功率将
a^(a^m)
(在我的情况下
2^(2^m)
),因此m将
O(日志i)
。对于Q2-你是对的,这是非常相似的,功率将是,1,2,4,16,256等等,所以log将是0,1,2,4,8等等,所以log将是1,2,3,4,。。。i、 e.迭代次数。@anir,您不应在注释中扩展原始问题。如果你有一个新问题,用正确的方式问一个新问题。同时,决定马克在这里接受的答案。@trincot我知道扩展这个问题可能不太好。但这些都是相关的问题。如果我必须提出新的问题,我必须重新建立这个问题的背景,因为我在问其他形式的迭代与此相比如何。通过问多个相关的问题从不同的方向攻击同一个概念有助于清晰地掌握这个概念。我知道如果我这样做,我会得到时间复杂性。做
i*=k
,得到
O(log_k(n))
。做
i=i^k
有什么相似之处吗?例如
i=i^4
is
O(log n)
@anir,您不应该在注释中扩展原始问题。如果你有一个新问题,用正确的方式问一个新问题。同时决定在这里将哪个答案标记为可接受。注意
O(logu4(n))=O(0.5*logu2(n))=O(logu2(n))
。基地不重要
i*=2
i*=4 (= 2*2)
i*=16 (= 4*4)
i*=256 (= 16*16)
etc