计算以下函数的时间复杂度
Calculate the time complexity of the following function
如何计算以下函数的时间复杂度?
int Compute (int n)
{
int j = 0;
int i = 0;
while (i<=n)
{
i = 2*j + i + 1;
j++;
}
return j-1;
}
现在,我知道循环的时间复杂度为 O(n),但在这种情况下 i
的增长速度要快得多。逐次迭代我发现,对于每第 m 次迭代 i = m^2
。但是我仍然很困惑如何计算Big-O。
如果您查看 i 和 j 的值几次迭代:
i=1
j=1
i=4
j=2
i=9
j=3
i=16
j=4
等等。通过数学归纳法我们可以证明 i 取平方值:( 2*n + n^2 + 1 = (n+1)^2 )
因为我们只在 i<=n 时循环并且因为 i 取值 1, 2^2, 3^2,..., k^2 <=n, 这意味着我们在 i=k 时停止超过 sqrt(n)。因此复杂度似乎是 O(k) 这意味着 O(sqrt(n)).
如何计算以下函数的时间复杂度?
int Compute (int n)
{
int j = 0;
int i = 0;
while (i<=n)
{
i = 2*j + i + 1;
j++;
}
return j-1;
}
现在,我知道循环的时间复杂度为 O(n),但在这种情况下 i
的增长速度要快得多。逐次迭代我发现,对于每第 m 次迭代 i = m^2
。但是我仍然很困惑如何计算Big-O。
如果您查看 i 和 j 的值几次迭代:
i=1
j=1
i=4
j=2
i=9
j=3
i=16
j=4
等等。通过数学归纳法我们可以证明 i 取平方值:( 2*n + n^2 + 1 = (n+1)^2 )
因为我们只在 i<=n 时循环并且因为 i 取值 1, 2^2, 3^2,..., k^2 <=n, 这意味着我们在 i=k 时停止超过 sqrt(n)。因此复杂度似乎是 O(k) 这意味着 O(sqrt(n)).