Algorithm 为什么这个函数/循环是O(logn)而不是O(n)?
这个函数是O(log(n))。为什么?它不是循环到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
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