分析算法时间复杂度

算法时间复杂度:讲算法中基本操作的次数作为算法时间复杂度的度量

 

void fun(int n)
{
     int i=0;s=0;
     while(s<n)
     {
          ++i;
          s=s+i;
     }

}

求算法时间复杂度首先找出基本操作,有函数看出,++i,s=s+i属于基本操作,然后找出基本操作结束的那个点。如果假设循环执行m次结束,带入数据求出递推式。

 

i=0,s=0,                                        i=1,s=1

i=1,s=1,                                        i=2,s=1+2

i=2,s=1+2,                                   i=3,s=1+2+3

如果循环执行m次,则有:1+2+3.......+m+k=n(其中k为常数,用作不缺),1+2+3+....m的递推式为s=m(m+1)/2.

求递推式要用到:等差数列求和:s=na+dn(n-1)/2,其中a为首项,d为公差

                                求n公式:△=b^2-4ac

最后解得:T(n)=O(√n)      ,要把n的系数变为1

 

 

void mergesort(int i,int j)
{
       int m;
       if(i!=j)
       {
        m=(i+j)/2;
        mergesort(i,m);
        mersort(m+1,j);
        merge(i,j,m);//本函数时间复杂度为O(n)
       }

}

由函数可知:基本操作在if函数中。先研究if里面的式子,m=(i+j)/2,m的值应该位于i到j的中部,mersort(i,m)执行的式前一部分,mersort(m+1,j)执行的式后一部分。

 

函数规模为n,终止条件i!=j,也就是一直运行到i=j。

merge函数的时间复杂度为n,则基本操作的次数为cn(c为系数,只用凑合表示基本次数)。

f(n)=2f(n/2)+cn

f(n/2)=2f(n/4)+(1/2)cn    然后依次类推,就会得到递推式    f(n)=2^kf(n/(2^k))+kcn

f(1)=O(1)     ,  当n=2^k时(k等于log以2为底n的对数)  ,   f(n)=O(1)*n+cnlog2n(那个2为底数)

则复杂度T(n)=O(nlog2n)  

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值