时间复杂度log(n)与Big O(root n)

时间:2020-11-03 16:45:44

标签: algorithm data-structures

尝试分析以下代码段。 对于下面的代码,时间复杂度可以为Big O(log n)吗?我是渐近分析的新手。在本教程中,它说的是O(根n)。

int p = 0;
for(int i =1;p<=n;i++){
p = p +i;
}
,,,

1 个答案:

答案 0 :(得分:4)

变量p将采用连续值11+21+2+3

此序列称为三角数的序列;您可以在WikipediaOEIS上了解更多相关信息。

要注意的一件事是公式:

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)