为什么像i = i * 2这样的代码在循环中被认为是O(logN)?

时间:2017-03-12 21:50:32

标签: time-complexity big-o logarithm

为什么因为i = i * 2是以下循环的运行时被认为是O(logN)?

for (int i = 1; i <= N;) {
  code with O(1);
  i = i * 2;
}

4 个答案:

答案 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,...)不相关。此外,如果您有logi <= N,则无关紧要,因为这只会将迭代次数更改为1。

答案 2 :(得分:1)

你可以很简单地证明它。

权利要求: 对于t(0 base)迭代,i=2^t 证明,通过归纳。

Base:2^0 = 1,确实在第一次迭代中i=1

步骤:对于某些t+1i的值为2*i(t)(其中i(t)it的值迭代)。从归纳假设我们知道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),你的算法是对数的。