相信大家一定有和我一样的情况,学了了很久的数据结构和算法,但是对于空间复杂度和时间复杂度都有点模糊,有时候不懂得怎么去计算。接下来,我看了很多的资料,总结出来一部分东西,希望有用。
首先,我们来看看官方的解释:
时间复杂度: 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
我们通常用大写O来表示时间复杂度,遇到求时间复杂度的问题,我们可以按照以下几种办法来进行计算:
1.用1来取代时间中所有加法常数,记做 O(1);
2.修改后运行次数,只保留最高项。如:2n^2+2n的时间复杂度是O(n^2);
3.如果最高项存在且不是1,则去除与这个项相乘的常数。比如:3n^3的时间复杂度为O(n^3);
时间复杂度耗时时间从小到大为:
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
这个表格说明了常见的时间复杂度:
例子 | 时间复杂度 | 术语 |
12152002 | O(1) | 常数阶 |
3n+4 | O(n) | 线性阶 |
5n^2+9n+5 | O(n^2) | 平方阶 |
5log(2)n+6 | O(logn) | 对数阶 |
6n+6nlog(2)+15 | O(nlogn) | nlogn阶 |
n^3+n^2+5n+6 | O(n^3) | 立方阶 |
2^n | O(2^n) | 指数阶 |
空间复杂度: 是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算时通常是反复调用同一个方法,递归n次,就需要n个空间。与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作: S(n)=O(f(n))我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模。
注意:但是一般说的复杂度是时间复杂度,空间复杂度用的比较少。