数据结构给个小程序段,计算一下复杂度:
简单来说可以分为三种
1.超级简单秒出答案
秒出答案,自己秒一下就好。。。。
int fact(int n){
if(n<=1) return 1;
return n*fact(n-1);//实际上就是可以看成做了n-1,从n减到1,做了n次
}
复杂度o(n)
2.循环(单层&双层无关),条件判断有变化
单层循环一个while或者一个for啦,判断条件发生了变化,可以设一个执行次数 t 帮助解决。比如说:
void fun(int n){
int i=1;
while (i<=n)
i=i*2;//设这句话执行了 t 次
}
while的条件判断 i 的值发生了变化。设第4句话执行了 t 次, 那么i =2^t ,则判断条件就是 2^t<=n,把t 解出来是。复杂度o(
)。
下面这个例子也是,while的条件判断 sum 的值发生了变化。设第三句话执行次数为 t ,有sum=(1+t)t/2 <n ,解出复杂度O()
int func(int n){
int i=0,sum=0;
while(sum<n) sum+=++i;//拆解成i=i+1;sum=sum+1;
return i;
}
双层循环 但内外层循环无关,举个例子:
count=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
内外层循环无关,分开算,方法和单层的一样。设外循环执行t次 2^t<=n,解得O()
内层循环 执行m次, 复杂度O(n)。
最后两个相乘 复杂度O()
3.双层循环相关
内外层嵌套: 嗯 解得,(n^2-n)/2 复杂度O(n^2)。
for(i=n-1;i>1;i--)
for(j=1;j<i;j++)
if(a[i]>a[i+1])
a[i]和a[i+1]对换;