[ 数据结构 ] 时间和空间复杂度
1.算法效率
算法效率分析分为两种 : ①时间效率, ②空间效率
时间效率即为 时间复杂度 , 时间复杂度主要衡量一个算法的运行速度
空间效率即为 空间复杂度 , 空间复杂度主要衡量一个算法所需要的额外空间
2.时间复杂度
2.1 时间复杂度的概念
定义 : 再计算机科学中 , 算法的时间复杂度 是一个数学函数 , 它定量描述了 该算法的运行时间
用于衡量算法执行时间 随输入规模增长的变化趋势
2.2 大O的渐进表示法
计算func基本操作执行了多少次?
public static void func1(int N){int count = 0;for(int i = 0;i<N;i++){for(int j = 0;j<N;j++){count++;}}for(int k = 0;k<N*2;k++){count++;}int m = 10;while((m--)>0){count++;}System.out.println(count);}
func1执行基本操作次数:
F(N) = N^2 + 2*N + 10
实际中我们计算时间复杂度时 , 我们其实不一定要计算精确的执行次数 , 而只需要大概执行次数 , 那么我们这里使用大O的渐进表示法
O : 用于描述函数渐进行为的数学符号
2.3 推导大O阶方法
- 用常数 1 取代运行时间中的所有加法常数
- 再修改后的函数中 , 只保留最高阶项
- 如果最高阶存在且不是1, 则取出这一项的系数 , 结果就是大O阶
例如: func1使用大O简静法表示后 , func1的时间复杂度为 O(N^2)
通过用大O的渐进表示法 去掉了对结果影响不大的项 , 简洁明了的表示出了执行次数
另外 有些算法还存在 时间复杂度 最好 , 最坏 , 平均的情况
最坏情况 : 任意输入规模的最大运行次数 (上界)
平均情况 : 任意输入规模的期望运行次数
最好情况 : 任意输入规模的最小运行次数 (下界)
例如: 一个长度为N的数组中寻找一个数据 X
最好情况 : 一次找到 最坏情况 : N次找到 平均情况 : N/2次找到
在实际中一般关注的是算法的 最坏运行情况 , 所以数组中搜索数据的时间复杂度为O(N)
3.空间复杂度
定义 : 是对一个算法在运行过程中临时占用空间大小的度量
用于评估算法对内存资源的消耗情况
空间复杂度计算的是 变量的个数
O(1) 常数空间
int sum(int a, int b) {int result = a + b; // 仅占用固定空间return result;
}