int a = 3;
while (a <= n) {
a = a * a;
}
我的版本是它的复杂性:
http://www.mmoprophet.com/stuff/big-o.jpg
有这样的事吗?
答案 0 :(得分:8)
那不对。 a 不能成为big-O公式的一部分,因为它只是一个临时变量。
在我的脑海中,如果我们将乘法运算为常数运算,则执行的乘法次数将为 O(log log n ) 。如果您在每次迭代时乘以常量,则它将为O(log n )。因为每次迭代都会乘以越来越多的数字,所以还有另一个日志。
将其视为每次迭代加倍的位数。在超出限制之前,您可以将位数加倍多少次?位数是log n ,您可以将起始数字加上log 2 log n 次。
至于问题的另一方面,是的,O( n 的
答案 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)的)
以更易阅读的形式:
答案 3 :(得分:1)
在第i次迭代(i = 0,1,...)之后,a的值为3 2 i 。将有O(log log n)迭代,并假设在O(1)中的算术运算,这是时间复杂度。