时间复杂度和空间复杂度

来源:互联网 发布:php用qq邮箱发送邮件 编辑:程序博客网 时间:2024/06/08 02:03

将算法中基本操作的执行次数作为算法的时间复杂度
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=0for(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)

原创粉丝点击