一、时间复杂度
概念:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
时间复杂度:
1、衡量算法的运行速度
2、通过数指令(基本指令)个数,来间接地测量运行速度
3、具体的结果:关于数据规模(n)的函数关系
4、为了便于估算,使用大O标识符进行化简:
(1)只保留最高次项
(2)最高次项的系数为1
(3)O(n)/O(n^2)…
5.理论上应该区分 最好/最坏/平均情况,但为了便于估算,一般只需要估算最坏情况即可
1.计算时间复杂度的方法
最常见的方式:数循环次数(基本够用)借助图形去理解:二分查找
借助调用栈画图:递归(了解)
2.对常见的复杂度做个排序
o(1)<O(log(n))< O(n)< O(n * log(n))<O(n^2) <O(n^3)<O(2^n)
例如:
//计算阶乘递归factorial的时间复杂度?
long factorial(int N) {
return N < 2 ? N : factorial(N-1) * N;
}
基本操作递归了2N次,时间复杂度为O(2N)
二、空间复杂度
概念:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
例如:
// 计算阶乘递归Factorial的时间复杂度?
long factorial(int N) {
return N < 2 ? N : factorial(N-1)*N;
}
该递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)。