一、什么是复杂度?
- 程序执行时需要的计算量和内存空间,其中计算量是指时间复杂度,计算量大则需要时间久;内存空间是指空间复杂度和代码是否简洁无关,而是指计算机的cpu和内存计算复杂程度。
- 复杂度是数量级,不是具体的数字,是为了方便记忆和推广。比如,山川的高度、人的身高等,数量级是指一个相差不大的数量范围。
- 一般针对某一个具体的算法,而非一个完整的系统
二、复杂度的表示
-
时间复杂度-程序执行时需要的计算量(CPU)
用O表示复杂度
- O(1)一次就够,计算次数可数的数量级都称作O(1)级别的数量级 【如:object 取值/数学运算】
- O(logn)数量量的对数,该曲线表示logn函数的曲线,n是指横轴原始数据的输入量,随着n的变化,logn的曲线形势如图,logn的计算结果是纵轴,也就是计算量、时间复杂度、空间复杂度的结果。随着计算量的增长,曲线趋向于平缓,是个好的现象。【如:数组二分】
- O(n) 和传输的数量量一样,是一个分割线,输入量是多少,计算量就是多少。如输入量是5,计算量就是5,输入量是7,那么计算量就是7,较为符合常理。【如:数组的一维循环】
- O(n*logn)数据量*数据量的对数,计算量在增加时,曲线呈上走趋势,O(n)*O(logn) = O(nlogn)
- O(n^2)数据量的平方 当输入量为2时,计算量为4,输入量为3时,计算量为9,复杂度增速飞快。【如:数组的嵌套循环】
-
空间复杂度 - 程序执行时需要的内存空间
前端领域需要程序运行更快,重时间轻空间,因为运行在浏览器上,所以内存空间是共用的。常见的空间复杂度:
- O(1) 有限的、可数的空间(数量级)
- O(n) 和输入的数据量相同的空间(数量级):当定义一个数组时,数组的长度和空间有关系,长度是多少就需要占用多少空间
// 空间复杂度为O(1)
function fn(arr = []) {
const a = arr[1]
const b = arr[2]
}
// 空间复杂度为O(n)
function fn(arr = []) {
const arr2 = []
for (let i = 0; i < arr.length; i++){
arr2[i] = arr[i]
}
return arr2
}