微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

时间复杂度logn与Big Oroot n

如何解决时间复杂度logn与Big Oroot n

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

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

解决方法

变量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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。