算法时间复杂度:讲算法中基本操作的次数作为算法时间复杂度的度量
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)