您的位置:首页 > 其它

时间复杂度和空间复杂度

2017-08-17 10:38 288 查看
将算法中基本操作的执行次数作为算法的时间复杂度

T(n)=O(f(n)中增长最快的项/ 此项的系数) , 比如f(n)=2n3+4n2+100 , 则其时间复杂度为为T(n)=O(2n3/2)=O(n3)。

常用的比较关系如下:



通过以上分析我们总结出计算一个算法时间复杂度的步骤如下:

(1) 确定算法中的基本操作,以及问题的规模。

(2)根据基本操作执行情况计算出规模n 的函数f(n),并确定时间复杂度为T(n)=O(f(n)中增长最快的项/此项的系数)。

注意:有的算法中基本操作执行次数跟初始输入的数据有关。如果题目不做特殊要求,

一般我们依照使得基本操作执行次数最多的输入来计算时间复杂度,即将最坏的情况作为

算法时间复杂度的度量。

1.2.2 例题选讲

例题1:求出以下算法的时间复杂度。

void fun(int n)
{
int i=1,j=100;
while(i<n)
{
j++;
i+=2;
}
}


分析:

第一步:找出基本操作,确定规模n。

找基本操作(所谓基本操作,即其重复执行次数和算法的执行时间成正比的操作,通俗点说,这种操作组成了算法,当它们都执行完的时候算法也结束了,多数情况下我们取最深层循环内的语句所描述的操作作为基本操作),显然题目中j++;与i+=2;这两行都可以

第二步:计算出n 的函数f(n)。

显然,n 确定以后,循环的结束与否与i 有关,i 的初值为1,每次自增2,假设i 自增m 次后循环结束,则i 最后的值为1+2×m,因此有1+2×m+K=n(其中K 为一个常数,

因为在循环结束时i 的值稍大于n,为了方便表述和进一步计算,用K 将1+2×m 修正成n。

因为K 为常数,所以这样做不会影响最终时间复杂度的计算),解得m=(n-1-K)/2,即

f(n)=(n-1-K)/2,可以发现其中增长最快的项为n/2,因此时间复杂度T(n)=O(n)。

例题2:分析以下算法的时间复杂度。

void fun(int n)
{
int i,j,x=0;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
x++;
}


分析:

x++;处于最内层循环,因此取x++;做为基本操作。显然n 为规模。可以算出x++;的

执行次数为f(n)=n(n-1)/2,变化最快的项为n2,因此时间复杂度为T(n)=O(n2)。

例题3:分析以下算法的时间复杂度。

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


分析:

显然n 为规模,基本操作为i++;s=s+i;i 与s 都从0 开始,假设循环执行m 次结束,

则有s1=1,s2=1+2=3,s3=1+2+3=6, ……,sm=m(m+1)/2(其中sm 为执行到第m 次的时

候s 的值),则有m(m+1)/2+K=n,(K 为起修正作用的常数)由求根公式得:



即:

由此可知时间复杂度为:

T(n)=O(√n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: