什么是复杂度?
- 程序执行时需要的
计算量和内存空间(和代码是否简介无关) - 复杂度是
数量级(方便记忆、推广),不是具体的数 - 一般针对一个具体的算法,而非一个完整的系统
常见的复杂度有O(1)、O(logn)、O(n)、O(nlogn)、O(n^2),见下图
时间复杂度(程序执行时需要的计算量)
- 以下代码时间复杂度为
O(1),因为计算量是可数的,固定的
可数的意思就是:和输入量无关,无论输入量是1还是1000,都不影响它
function fn(obj) {
// O(1)
return obj.a +_obj.b + obj.c // 计算量为 4-5
}
function fn(obj, key) {
// O(1)
return obj[key] // 计算量为 1
}
- 以下代码时间复杂度为
O(n),因为输入量是多少,计算量就是多少
function fn(arr = []) {
// O(n)
// 如果数组长度是100,计算量就是100
// 如果数组长度是1000,计算量就是1000
for (let i = 0; i < arr.length; i++) {
console.info(arr[i])
}
}
- 以下代码时间复杂度为
O(n^2)
function fn(arr = []) {
// O(n^2)
// 如果数组长度是10,则外层循环执行10次,然后每次循环里又执行10次,则一共是100次,所以是n^2
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length; j++) {
console.info(j)
}
}
}
- 以下代码时间复杂度为
O(logn)
function fn(arr = []) {
// O(logn)
// 二分算法
}
- 以下代码时间复杂度为
O(nlogn)
function fn(arr = []) {
// O(nlogn) for循环中【嵌套】一个二分算法
for (let i = 0; i < arr.length; i++) {
// 二分算法
}
}
空间复杂度(程序执行时需要的内存空间)
- 以下代码空间复杂度为
O(1),因为计算量是可数的,固定的
function fn(arr = []) {
// O(1)
const a = arr[1]
const b = arr[2]
}
- 以下代码空间复杂度为
O(n),因为arr2所占空间与传入的数据量(arr)的长度有关,arr的长度越长,arr2所占的空间就越大
function fn(arr = []) {
// O(n)
const arr2 = []
for (let i = 0; i < arr.length; i++) {
arr2[i] = arr[i] + 10
}
return arr2
}
前端领域重时间轻空间,因为前端要求程序运行时间更快一些。