简单的循环Big-O复杂性

时间:2010-06-05 16:56:40

标签: big-o complexity-theory

int a = 3;

while (a <= n) {
    a = a * a;
}

我的版本是它的复杂性:
http://www.mmoprophet.com/stuff/big-o.jpg
有这样的事吗?

4 个答案:

答案 0 :(得分:8)

那不对。 a 不能成为big-O公式的一部分,因为它只是一个临时变量。

在我的脑海中,如果我们将乘法运算为常数运算,则执行的乘法次数将为 O(log log n 。如果您在每次迭代时乘以常量,则它将为O(log n )。因为每次迭代都会乘以越来越多的数字,所以还有另一个日志。

将其视为每次迭代加倍的位数。在超出限制之前,您可以将位数加倍多少次?位数是log n ,您可以将起始数字加上log 2 log n 次。


至于问题的另一方面,是的,O( n 。它会更熟悉地写成 O( n 1 / a

答案 1 :(得分:2)

嗯,你实际上可以进入一个无限循环!

假设32位整数:

试试这个:

int a = 3 ;
int n = 2099150850;
while (a <= n)
{
    a = a*a;
}

但假设没有整数溢出,其他海报是正确的,如果你假设O(1)乘法,它是O(log logn)。

一种简单的方法是:

x n + 1 = x n 2

取x 1 = a。

记录日志。

t n = log x n

然后 t n + 1 = 2t n

我会把剩下的留给你。

如果考虑两个k位数的乘法的复杂性,会变得更有趣。

答案 2 :(得分:1)

循环迭代次数为Ο(log log n)。循环体本身进行赋值(我们可以认为是常量)和乘法。到目前为止,最着名的乘法算法的步长复杂度为Ο(n log n×2 Ο(log * n)),因此,总的来说,复杂性是像:

  

Ο(日志记录n×n的登录N×2 Ο(日志 * n)的

以更易阅读的形式:

Ο(log log n × n log n×2^Ο(log* n)) http://TeXHub.Com/b/TyhcbG9nXGxvZyBuXCxcdGltZXNcLG4gXGxvZyBuXCxcdGltZXNcLDJee08oXGxvZ14qIG4pfSk=

答案 3 :(得分:1)

在第i次迭代(i = 0,1,...)之后,a的值为3 2 i 。将有O(log log n)迭代,并假设在O(1)中的算术运算,这是时间复杂度。