应对考试的计算程序复杂度。。。欸

数据结构给个小程序段,计算一下复杂度:

简单来说可以分为三种

1.超级简单秒出答案

2.循环(单层&双层无关),条件判断有变化

3.双层循环相关


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 解出来是\log _{2}n。复杂度o(\log _{2}n)。

下面这个例子也是,while的条件判断 sum 的值发生了变化。设第三句话执行次数为 t ,有sum=(1+t)t/2 <n ,解出复杂度O(\sqrt{N})

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(\log _{2}n

内层循环 执行m次, 复杂度O(n)。

最后两个相乘 复杂度O(n\log _{2}n

 

3.双层循环相关

内外层嵌套:\sum_{i=1}^{n-1}\sum_{j=1}^{i}1      嗯 解得,(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]对换;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值