问题描述
尝试分析以下代码段。 对于下面的代码,时间复杂度可以为Big O(log n)吗?我是渐近分析的新手。在本教程中,它说的是O(根n)。
int p = 0;
for(int i =1;p<=n;i++){
p = p +i;
},
解决方法
变量p
将采用连续值1
,1+2
,1+2+3
等
此序列称为三角数的序列;您可以在Wikipedia或OEIS上了解更多相关信息。
要注意的一件事是公式:
1 + 2 + ... + i = i*(i+1)/2
因此,您的代码可以用等效形式重写:
int p = 0;
for (int i = 1; p <= n; i++)
{
p = i * (i + 1) / 2;
}
或者,完全摆脱p
:
for (int i = 1; (i - 1) * i / 2 <= n; i++)
{
}
因此,您的代码在(i-1)*i <= 2n
时运行。您可以进行近似(i-1)*i ≈ i^2
来查看循环运行约sqrt(2n)
个操作。
如果您对这种近似不满意,则可以求解i
的二次方程式:
i^2 - i - 2n == 0
您会发现循环在以下时间运行:
i <= (1 + sqrt(1 + 8n)) / 2 == 0.5 + sqrt(2n + 0.125)