[英]Big-O analysis for loop
我必须弄清楚这个循环的 Big-O 运行时间。
for (int k = 1; k < N; k = k*4){
sequence of statements
}
我大部分都理解,除了k = k*4
给我带来了困难。 我最好的猜测是 O(n),但我不确定。 任何人都可以帮忙吗?
尝试列出k
的值以了解它将如何增加。 1 -> 4 -> 16 -> 64 ->...
正如我们所见, k
遵循4^j
的模式,其中 j 从 0 开始,每次加一。 那么在k >= N
之前,我们的 for 循环将经过多少次迭代? 让我们解决j
! 4^j >= N
也可以写成j >= log base 4 of N
。 这意味着对于大小为N
的输入,我们将有 N 次迭代的以 4 为底的对数,就复杂性而言,它是O(log(n))
。 现在显然 for 循环中的任何内容都会影响最终的复杂性,但希望这可以帮助您处理外部循环。
这是另一种让你的头脑绕过那个外环的方法。
将循环重写为:
for(int i=0; pow(4,i)<N; ++i){
int k=pow(4,i); //Where pow is a nicely behaved int function....
}
为什么会有帮助? 那么应该更容易看到循环的迭代在 pow(4,i)>=N 时结束并且对双方进行对数给出 Log(4)*i=Log(N)。
这是基于您可能记得的 Log(a^b)=log(a)*b 的数学恒等式... 注意:^ 在这里的意思是 'to the power of'。
所以 i 以 1 秒计数,直到等于或超过 Log(N)/Log(4)。
渐近复杂度 O(Log(N)/Log(4)) 但 1/Log(4) 是一个常数,我们丢弃 Big-O 中的常数因子并得到 O(Log(N))。
这是有道理的,因为当 N 变大 4 倍时,我们只需要再进行一次迭代,因为 k 每次迭代都会变大 4 倍。
如果 k=k*10 我们取 log10(N) 可能很明显,但是因为我们忽略了 big-O 中的常数因子,所以这一切都归结为对数缩放规则(对于那个外循环)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.