时间复杂度分析:只保留高阶项 舍弃系数
常用的时间复杂度:
常数型 O(1) 线性型 O(n) 平方型 O(n2) 立方型 O(n3)指数型O(2n) 对数型O(log2n) 二维型O(nlog2n)
for(inti=1;i<=n;i++)
{for(intj=1;j<=n;j++)
{c[i][j]=0;}
在for循环中:表达式1执行1次,表达式2每次都执行,表达式3每次都执行
对于此代码,我们先逐句分析:
第1个for循环:i从1到n共执行n次
第2个for循环:当i=1时,j从1到n执行n次;当i=2时,j从1到n执行n次;当i=3时,j从1到n执行n次;..当i=n时,j从1到n执行n次
即第2个for循环的执行次数是第1个for循环执行次数的n倍
计算:O(f(n))=(1+n+n)+n*(1+n+n)+(n*n)=3n^2+3n+1
即O(f(n))=O(n*n)
{++x,s+=x;}//O(n)=1
for(inti=1;i<=n;++i)//O(n)=n
{++x,s+=x;}
从1到n进行循环,语句共执行2n次
for(inti=1;i<=n;++i)//O(n)=n*n
for(intj=1;j<=n;++j)
{++x,s+=x;}
for(inti=2;i<=n;++i)//O(n)=n*n
for(intj=2;j<=i-1;++j)
{++x,a[i,j]=x;}
当n=2时,执行0次;当n=3时,执行2*1次
当n=4时,执行2*2次;...当n=n时,执行2*(n-2)次
即2*(0+1+2+..+(n-2))=2*((n-2)*(n-1)/2)=n*n
int Fun(intn)
{
if(n<=1)//边界条件
{return0;}
returnFun(n-1)+1;//O(n)
//n,n-1,n-2,n-3... 反过来看0,1,2,3...n
returnFun(n-2)+n;//O(n)
//n,n-2,n-4,n-6... 反过来看0,2,4,6...n
returnFun(n-3)+1;//O(n)
//n,n-3,n-6,n-9... 反过来看0,3,6,9...n
returnFun(n/2)+1;//O(log2(n))
//n,n/2,n/4,n/8... 反过来看1,2,4,8,16...2x=n 即x=log2n
}