下面这段代码的算法的时间复杂度是多少,最好能解释下思路

发布于 2022-09-11 16:17:38 字数 108 浏览 8 评论 0

下面这段代码的算法的时间复杂度是多少,最好能解释下思路

i= s = 0;
while (s<n)
{
    i++;
    s+=i;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

≈。彩虹 2022-09-18 16:17:38

O(n^1/2)

策马西风 2022-09-18 16:17:38

i 刚好终止,由求和公式得到 (0 + i) * (i + 1) / 2 >= n,保留最高阶 i^2,得到 O(sqrt(n)) 时间复杂度。

风追烟花雨 2022-09-18 16:17:38

暴力法(因为我脑子懒但手勤快)

$ cat complex.groovy


def doit(int n){ 
    int i= s = 0;
    int count=0;
    while (s<n)
    {
        i++;
        s+=i;
        count ++;
    }
    println Math.sqrt(n)+" "+count;
}


doit(1);
doit(10);
doit(100);
doit(1000);
doit(10000);
doit(100000);
doit(1000000);

$ groovy complex.groovy

1.0 1
3.1622776601683795 4
10.0 14
31.622776601683793 45
100.0 141
316.22776601683796 447
1000.0 1414

所以算法复杂度是根号(2n): (2n)^1/2, 一般忽略常数系数, O(n^(1/2))
把 s 打印出来,很容易发现规律的.

1
3
6
10
15
21
28
36
45
55
66
78
91
105
...

PS: 根号2的新求法 ;)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文