算法的时间复杂度、空间复杂度

时间复杂度和空间复杂度是度量算法效率的常用指标

时间度量

  1. 事后统计,不常用
  2. 事前统计影响因素:
    算法策略 问题规模 程序语言 代码质量 机器执行指令的速度

撇开软硬件的影响,算法运行工作量的大小只依赖于问题的规模(通常用整数n表示)
一个算法是由控制结构(顺序,分支,循环三种)和原操作(指固有数据类型的操作)构成,则算法时间取决于两者的综合效果。

为了便于比较同一问题的不同算法,通常从算法中选取一种对于所研究问题来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间度量。
算法的时间复杂度记做 T(n)=O(f(n))
它表示随问题规模n的增大,算法执行时间的增长率和 f(n) 的增长率相同

原操作的执行次数与包含他的语句的执行次数相同

  • {++x; s = 0; }
  • for( i = 1 ; i <= n ; ++i ) { ++x ; s += x;}
  • for( j = 1 ; j <= n ; ++j )
    for( k = 1 ; k <= n ; ++k ) { ++x ; s += x;}

含基本操作“x+1”的语句的频度分别为1,n和n^2,所以这三个程序段的时间复杂度分别为O(1)、O(n)、O( n^2 ) ,分别称为常量阶,线性阶和平方阶。

有些情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同。例如在冒泡排序算法中,“交换序列中相邻两个整数”这个基本操作执行次数可能为0,或者O(n^2)。这类算法时间复杂度有两种表示方法:一是考虑所有情况下时间复杂度的期望值(麻烦,而且出现概率难确定,所以不常用);另一种是以最坏的情况下的时间复杂度作为该算法的时间复杂度。

时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值;而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2) 的复杂度。还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n) 的指数级复杂度,甚至O(n!)的阶乘级复杂度。

空间复杂度

S(n)=O(f(n))
存储空间,工作空间(计算等),辅助存储空间等
空间复杂度感觉不怎么常用。。。不研究了。。。。

参考文献:《数据结构》 严蔚敏,吴伟民编著
参考链接:http://www.matrix67.com/blog/archives/105

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值