简单while循环Big-O复杂性 inta=3; 而(a

简单while循环Big-O复杂性 inta=3; 而(a,big-o,complexity-theory,Big O,Complexity Theory,这是不对的。a不能是big-O公式的一部分,因为它只是一个临时变量 在我看来,如果我们把乘法作为一个常数时间运算,那么执行的乘法数将是O(logn)。如果你每次迭代都乘以一个常数,那么它将是O(logn)。因为你每次迭代都乘以一个不断增长的数,所以还有另一个日志 可以将其视为每次迭代的位数翻倍。在超出限制之前,可以将位数翻倍多少次?位数为logn,起始位数可以翻倍log2 logn 至于问题的另一个方面,是的,O(n的a根)可以是某个常数a的有效复杂性类。更常见的情况是,它可以写成O(n1/a

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

在我看来,如果我们把乘法作为一个常数时间运算,那么执行的乘法数将是O(logn)。如果你每次迭代都乘以一个常数,那么它将是O(logn)。因为你每次迭代都乘以一个不断增长的数,所以还有另一个日志

可以将其视为每次迭代的位数翻倍。在超出限制之前,可以将位数翻倍多少次?位数为logn,起始位数可以翻倍log2 logn



至于问题的另一个方面,是的,O(n的a根)可以是某个常数a的有效复杂性类。更常见的情况是,它可以写成O(n1/a)。

循环迭代的次数是○(log 日志 循环体本身做一个赋值(我们可以认为是常数)和乘法运算。迄今为止,最著名的乘法算法具有席夫的步长复杂性(n)。 日志 n×2Ⅹ(对数)* n) )因此,综上所述,其复杂性大致如下:

⑩(对数) 日志 N × N 日志 n×2Ⅹ(对数)* n) )

以更可读的形式:


在第i次迭代(i=0,1,…)之后,a的值是32i。将有O(logn)次迭代,并且假设在O(1)中进行算术运算,这是时间复杂度。

好吧,你实际上可以进入一个无限循环

假设32位整数:

试试这个:

int a = 3;

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

而(a+1表示明显使用了MSPaint。您能更新图像吗?对不起,现在没有了,是很久以前的事了。我假设公式中的
a
应该是
a
的初始值(即显示的代码中的3),这是一个常数,因此在公式中出现是有意义的。
a
可以被视为算法的输入(从描述中根本不清楚)。并且运行时间会随着
a
初始值的变化而变化。尽管它们是否渐近地变化,我不能一目了然。a的起始值与大O复杂度无关。如果n是一个googolplex,那么无论从a=3、a=100或a=999999开始,都只会减少固定不变的乘法数假设。如果你将a作为变量,那么它将是θ(logn-loga),这在直觉上是有意义的,因为a越大,执行的迭代就越少。无论a是常数还是输入,它在复杂度中的出现仍然有效。这看起来是对的。如果k位的乘法是f(k),那么总数是Sigma f(2^r),r=1到logn。仅考虑2r>=loglogn,我们得到的是你所拥有的θ(不仅仅是BigOh)。
int a = 3 ;
int n = 2099150850;
while (a <= n)
{
    a = a*a;
}