C 循环的时间复杂度
我不确定以下C代码块的复杂性:C 循环的时间复杂度,c,time-complexity,complexity-theory,C,Time Complexity,Complexity Theory,我不确定以下C代码块的复杂性: int i = 0, j = 1; for ( i = 0; i < n * n; i += j ) { O1(); j += 2; } inti=0,j=1; 对于(i=0;i
int i = 0, j = 1;
for ( i = 0; i < n * n; i += j )
{
O1();
j += 2;
}
inti=0,j=1;
对于(i=0;i
其中O1是一个显然需要恒定时间执行的函数。现在,我知道循环的计数器每次迭代都会增加一个常量,其复杂度通常为O(sqrt(n))
,但这里也是这样吗?或者是O(sqrt(n^2))
,也就是O(n)
谢谢
我知道循环的计数器在每次迭代中增加一个常量,其复杂度通常为O(sqrt(n))
那是假的。一个循环,其计数器在每次迭代中增加一个常量是O(N)
一个循环,其计数器的增加量在每次迭代中线性增加,即为O(sqrt(N))
在本例中,N
这里是N*N
,因为这就是循环的循环,所以简单的替换告诉您,是的,操作是O(sqrt(N^2))或O(N)
我知道循环的计数器在每次迭代中增加一个常量,其复杂度通常为O(sqrt(n))
不那不是真的。以这个循环为例
for(i = 0; i < n; i++)
这是一个算术级数。它也可以写成
0^2 - 1, 1^2 - 1, 2^2 - 1, 3^2 - 1, 4^2 - 1, 5^2 - 1, 6^2 - 1, ...
现在循环将一直运行,直到
i
达到n^2
,(i
)
因此,您可以从中推断,循环将运行O(n)
因此,复杂性是O(n)它是O(n),因为循环将精确地迭代n次
在第1步中:i
的值为1*1-1
,即0
在第2步中:i
的值将是2*2-1
,即3
在第3步中:i
的值将是3*3-1
,即8
在交互n上:i
的值将是n*n-1
。这将导致循环终止
总之,i
的增长速度足够快,可以在n
迭代中达到n*n-1
。变量i遵循一个算术过程:实际上,它是一个算术序列或二次序列。它不会精确迭代n次。它是O(n),但那里有一个系数。@Servy,它将精确地迭代n
次,您可以验证。谢谢您的更正和确认我的怀疑。如果计数器以几何级数增加呢?请提供证据!i=S(n)=n*(n+1)/2@w.kovacs然后,执行的操作数与几何数成反比。@Servy如何用大O表示法表示?@w.kovacs,这将是对数。
0^2 - 1, 1^2 - 1, 2^2 - 1, 3^2 - 1, 4^2 - 1, 5^2 - 1, 6^2 - 1, ...