我不确定下面这段C代码的复杂性:
int i = 0, j = 1;
for ( i = 0; i < n * n; i += j )
{
O1();
j += 2;
}
O1是一个显然需要恒定时间执行的函数。我知道,循环计数器每次迭代增加一个常量的循环通常具有复杂度为O(sqrt(n))
,但这里也是这种情况吗?还是O(sqrt(n^2))
,即O(n)
?
谢谢
我不确定下面这段C代码的复杂性:
int i = 0, j = 1;
for ( i = 0; i < n * n; i += j )
{
O1();
j += 2;
}
O1是一个显然需要恒定时间执行的函数。我知道,循环计数器每次迭代增加一个常量的循环通常具有复杂度为O(sqrt(n))
,但这里也是这种情况吗?还是O(sqrt(n^2))
,即O(n)
?
谢谢
for(i = 0; i < n; i++)
变量i
的值每次增加一个常数,即1
。但是循环的复杂度为O(n)
。
如果你仔细观察这个序列,会发现值i
所得到的是:
0, 3, 8, 15, 24, 35, ...
这是一个等差数列。它还可以写成
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 < n*n
)
因此,您可以推断出循环将运行O(n)
次。
因此,复杂度为O(n)
这是O(n)的,因为循环将恰好迭代n次。
在第一次迭代中:i
的值将为1 * 1 - 1
,即0
在第二次迭代中:i
的值将为2 * 2 - 1
,即3
在第三次迭代中:i
的值将为3 * 3 - 1
,即8
...
在第n次迭代中:i
的值将为n * n - 1
。这导致循环终止。i
增长得足够快,可以在n
次迭代中达到n * n - 1
。n
次,您可以验证。 - Yacoub Massad