求如下一个三重循环程序的算法复杂度
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=j;k++)
m++;
我们先来看一下一个标准的二重循环程序的复杂度是如何求的
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
m++;
这个算法与冒泡排序的复杂度一样是\(O(n^2)\)
计算过程如下:
重新回到题目,可以得出以下计算步骤:
此时需要用到另外一个求和公式:\(S(n)=1+2^2+...+n^2=\frac{n*(n+1)*(2n+1)}{6}\)
推导步骤如下:
将上述式子相加,即:
则原式可得:
编写程序验证,完全吻合结果:
#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
void f1(int n){
ll cnt=0;
for(ll i=1;i<=n;i++)
for(ll j=1;j<=i;j++)
for(ll k=1;k<=j;k++)
cnt++;
cout<<cnt<<" ";
ll res=(ll)n*(n+1)*(n+2)/6;//公式法
cout<<res<<" ";
cout<<((ld)1.0*cnt/res?"true":"false")<<endl;
}
int main()
{
for(int i=1;i<=100;i++)
f1(i);
return 0;
}
原文:https://www.cnblogs.com/tltr/p/13387241.html