Time complexity 为什么像i=i*2这样的代码在循环中被认为是O(logN)?
为什么因为i=i*2,循环的运行时被认为是O(logN)Time complexity 为什么像i=i*2这样的代码在循环中被认为是O(logN)?,time-complexity,big-o,logarithm,Time Complexity,Big O,Logarithm,为什么因为i=i*2,循环的运行时被认为是O(logN) for(inti=1;i看看1024=210。你需要将数字1加倍多少次才能得到1024 Times 1 2 3 4 5 6 7 8 9 10 Result 2 4 8 16 32 64 128 256 512 1024 所以你必须运行双倍循环十次才能得到210,一般来说,你必须运行双倍循环n次才能得到2n。但是什么是n?它是log2n,所以
for(inti=1;i看看1024=210。你需要将数字1加倍多少次才能得到1024
Times 1 2 3 4 5 6 7 8 9 10
Result 2 4 8 16 32 64 128 256 512 1024
所以你必须运行双倍循环十次才能得到210,一般来说,你必须运行双倍循环n次才能得到2n。但是什么是n?它是log2n,所以一般来说,如果n是2的某个幂,循环必须运行log2n次才能达到它。要使算法处于O(logN)
,对于它需要的任何n(大约)日志N个步骤。在N=32(其中日志32=5)的示例中,可以看到:
i = 1 (start)
i = 2
i = 4
i = 8
i = 16
i = 32 (5 iterations)
i = 64 (abort after 6 iterations)
一般来说,在x
迭代之后,i=2^x
保持不变。要达到i>N
您需要x=logn+1
PS:当谈到复杂性时,log
base(2,10,e,…)是不相关的。此外,如果你有ii从1开始,然后在每次迭代中用2乘以它,这意味着:
在一些K,2^(K-1)将大于(或等于)N
这意味着N你可以非常简单地证明它
索赔:
对于t
th(0基)迭代,i=2^t
通过归纳法证明
Base:2^0=1
,实际上在第一次迭代中,i=1
步骤:对于一些t+1
,i
的值是2*i(t)
(其中i(t)
是t
迭代中i
的值)。根据归纳假设,我们知道i(t)=2^t
,因此i(t+1)=2*i(t)=2*t=2^(t+1)
,权利要求成立
现在,让我们检查一下停止条件。我们迭代循环,而我确定您的意思是包含乘法的行吗?整个循环具有日志复杂性。我的意思是,整个循环,对此仍然是新的。
i = 1 (start)
i = 2
i = 4
i = 8
i = 16
i = 32 (5 iterations)
i = 64 (abort after 6 iterations)