复杂度分析✅
什么是大 O 表示法,它的作用是什么?
答案
复杂度分析用于评估算法的优劣。 复杂度分析分为两个方面
- 时间复杂度 评估算法执行效率
- 空间复杂度 评估算法资源占用
由于代码的执行效率多和输入数据规模相关。采用大 O 表示法评估时间或空间复杂度随数据规模的增长趋势。
由于目前计算机硬件能力提升,主要关心时间复杂度。典型的时间复杂度的大 O 表示如下:
O(1)
常量型操作,不随数据量增大发生变化效率最高O(logn)
对数增长O(n)
线性增长O(nlogn)
O(n^2)
O(n!)
阶乘增长
空间复杂度同理
利用如下规则简化复杂度分析
- 忽略常数项
O(2n) => O(n)
- 相加取复杂度大的
O(n) + O(n^2) => O(n^2)
- 相乘则复杂度也相乘
O(n)*O(n) => O(n^2)
复杂度分类
- 最好
- 最坏
- 平均
高级复杂度分析
- 摊还分析:用于分析具有摊还成本的算法,如动态数组的扩展。
- 递归树方法:用于分析递归算法的复杂度。
示例
// O(1) 常量时间复杂度
function constantTimeOperation (arr) {
return arr[0]
}
// O(n) 线性时间复杂度
function linearTimeOperation (arr) {
for (let i = 0; i < arr.length; i++) {
console.log(arr[i])
}
}
// O(n^2) 平方时间复杂度
function quadraticTimeOperation (arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length; j++) {
console.log(arr[i], arr[j])
}
}
}