Algorithm 为什么这个函数/循环是O(logn)而不是O(n)?

Algorithm 为什么这个函数/循环是O(logn)而不是O(n)?,algorithm,big-o,Algorithm,Big O,这个函数是O(log(n))。为什么?它不是循环到n吗 function fxn($n) { for ($i = 1; $i <= $n; $i *= 2) echo $i; } 函数fxn($n){ 对于($i=1;$i注意:您的函数永远不会结束,因为您从0开始,0*2=0。我假设您的循环从1开始 循环每次递增2的倍数,这就是为什么运行时是O(lg(n)) 让我们考虑一个简单的例子,其中n=128。< /P> 以下是每次迭代的i值:1、2、4、8、16、32、6

这个函数是O(log(n))。为什么?它不是循环到n吗

function fxn($n) {
    for ($i = 1; $i <= $n; $i *= 2)
        echo $i;
}
函数fxn($n){

对于($i=1;$i注意:您的函数永远不会结束,因为您从0开始,0*2=0。我假设您的循环从1开始

循环每次递增2的倍数,这就是为什么运行时是
O(lg(n))

让我们考虑一个简单的例子,其中n=128。< /P> 以下是每次迭代的i值:1、2、4、8、16、32、64、128。因此,您已经使用了8个值

lg(128) = 7 (lg = log in base 2)
        = 8 - 1
请注意,
-1
是一个常量,因此它不会影响我们的运行时计算


如果循环增加1(或任何常数k),则运行时为O(n)这里要考虑的重要事项是<强>几何级数< /强>和<强>算术系列< /强>,这给了您不同的运行时间。

< p>它没有遍历所有元素,在每一步中它跳过前一步元素的两倍——因为<代码> $i=2 < /COD>部分。t是,假设
$i
以大于零的值开始,否则它是一个无限循环:
$i
在写入时总是
0

这个循环将是O(n):

但是这个循环只有O(log(n)):


以这种方式增长的序列称为“对数”。

您的代码循环到
n
,但不是通过1(或任何常量值)循环,这将使其成为O(n)

这就是它所做的:

       1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
       |  |     |           |                       |
       +--+-----+-----------+-----------------------+
Steps    1    2        3               4

因为它每次都翻倍,实际上是O(logn),类似于二叉树搜索在每次迭代中将搜索空间减半的方式。

如此多的好答案表明[几乎]完全相同;-)对不起,各位,我认为1对于初始化$I:)这可能与任何想知道O(1)的人有关
因为它运行的次数是恒定的。@fanjavaid第一个函数迭代
n
次。随着
n
的增长,循环的迭代次数也会增加。如果
n
为10亿次,循环运行10亿次。这是标准的
O(n)
操作。从3-4开始有2步,从5-8开始有3步,等等。对吗
1, 2, 3, 4, 5, 6, 7, ..., n
function fxn($n) {
    for ($i = 1; $i <= $n; $i *= 2)
        echo $i;
}
1, 2, 4, 8, 16, 32, 64, ..., n
       1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16
       |  |     |           |                       |
       +--+-----+-----------+-----------------------+
Steps    1    2        3               4