什么是复杂度

155 阅读1分钟

什么是复杂度?

  • 程序执行时需要的计算量内存空间(和代码是否简介无关)
  • 复杂度是数量级(方便记忆、推广),不是具体的数
  • 一般针对一个具体的算法,而非一个完整的系统

常见的复杂度有O(1)、O(logn)、O(n)、O(nlogn)、O(n^2),见下图

image.png

时间复杂度(程序执行时需要的计算量)

  1. 以下代码时间复杂度为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
}
  1. 以下代码时间复杂度为O(n),因为输入量是多少,计算量就是多少
function fn(arr = []) {
    // O(n)
    // 如果数组长度是100,计算量就是100
    // 如果数组长度是1000,计算量就是1000
    for (let i = 0; i < arr.length; i++) {
        console.info(arr[i])
    }
}
  1. 以下代码时间复杂度为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)
        }
    }
}
  1. 以下代码时间复杂度为O(logn)
function fn(arr = []) {
    // O(logn)
    // 二分算法
}
  1. 以下代码时间复杂度为O(nlogn)
function fn(arr = []) {
    // O(nlogn) for循环中【嵌套】一个二分算法
    for (let i = 0; i < arr.length; i++) {
        // 二分算法
    }
}

空间复杂度(程序执行时需要的内存空间)

  1. 以下代码空间复杂度为O(1),因为计算量是可数的,固定的
function fn(arr = []) {
    // O(1)
    const a = arr[1]
    const b = arr[2]
}
  1. 以下代码空间复杂度为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
}

前端领域重时间轻空间,因为前端要求程序运行时间更快一些。