为什么因为i = i * 2是以下循环的运行时被认为是O(logN)?
for (int i = 1; i <= N;) {
code with O(1);
i = i * 2;
}
答案 0 :(得分:3)
看1024 = 2 10 。你有多少次将数字1加倍才能获得1024?
Times 1 2 3 4 5 6 7 8 9 10
Result 2 4 8 16 32 64 128 256 512 1024
所以你必须运行你的双倍循环十次才能得到2 10 一般来说,你必须运行双倍循环n次以获得2 n 。但是什么是n?它是log 2 2 n ,所以通常如果n是2的幂,则循环必须运行log 2 n次到达它。
答案 1 :(得分:2)
要将算法放在<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/(.*)$ api.php/$1 [L]
</IfModule>
中,对于任何N,它需要(周围)记录N个步骤。在N = 32(其中log 32 = 5)的例子中,可以看到:
O(logN)
通常,在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
。
PS:谈到复杂性时,x = log N + 1
基数(2,10,e,...)不相关。此外,如果您有log
或i <= N
,则无关紧要,因为这只会将迭代次数更改为1。
答案 2 :(得分:1)
你可以很简单地证明它。
权利要求:
对于t
(0 base)迭代,i=2^t
证明,通过归纳。
Base:2^0 = 1
,确实在第一次迭代中i=1
。
步骤:对于某些t+1
,i
的值为2*i(t)
(其中i(t)
是i
中t
的值迭代)。从归纳假设我们知道i(t)=2^t
,因此i(t+1) = 2*i(t) = 2*2^t = 2^(t+1)
,并且声明成立。
现在,让我们来看看我们的停止标准。我们在i <= N
时迭代循环,并且从上面的声明中,这意味着我们在2^t <= N
时迭代。通过双方执行log_2
,我们得到log_2(2^t) <= log_2(N)
,自log_2(2^t) = t
以来,我们得到的是t <= log_2(N)
时的迭代 - 所以我们迭代Theta(log_2(N))
次。 (结论证明)。
答案 3 :(得分:0)
我从 1 开始,然后在每次迭代中将它乘以 2 ,这意味着:
在某些 K 中, 2 ^(K-1)将比 N 更大(或相等)。
这意味着 N <= 2 ^(K-1)
这意味着 log(N)&lt; = K-1
K-1 将是您的循环运行的迭代次数,因为 K-1 大于或等于 log(N),你的算法是对数的。