繁体   English   中英

以下代码的运行时间复杂度是多少?

[英]What is the running time complexity of the following piece of code?

void foo(int n){
  int i = 1, sum = 1;
  while (sum <= n) {
    i++;
    sum+=i;
  }
}

我的感觉是,只有当总和大于参数n ,循环才会终止。 并且,第j次迭代的Sum为: S(j) = S(j-1) + j

S(1) = S(0) + 1
S(2) = S(1) + 2
S(3) = S(2) + 3
...
S(n) = S(n-1) + n

我应该怎么走? 我被这种重复关系困扰。

1 + 2 + 3 + ... + j次大于n时,循环将终止。 但是我不相信这是否可以。

证明这一点的经典方法是按两个顺序将序列写两次,即:

S(n) = 1 +   2 +       3    + ...+ n-2 + n-1 + n
S(n) = n + (n-1) + (n-2) + ...+ 3    +   2   + 1

如果您逐项总结这些术语,您将得到

2S(n)= n+1 + n+1 + n+1 + ... + n+1 

n

因此

S(n) = n*(n+1)/2

(据称是高斯发现的一个小学生的结果)

由此可见,它需要进行O(sqrt(n))次迭代。

您差不多完成了。 您需要注意的最后一件事是1 + 2 + 3 + ... + j(1 + j) * j / 2O(j^2) 这是数学(算术级数)中众所周知的公式。

它会在k次迭代后中断

1 + 2 + .... + k > n

k*(k+1)/2 > n

k*k + k - 2*n >0

k k = (-1 + sqrt(1+8n))/2 (舍弃负值)

因此,时间复杂度为sqrt(n)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM