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

 

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)