繁体   English   中英

循环的大 O 分析

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM