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
isO(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