理解什么是算法复杂度

简介: 对算法复杂度的理解

1、复杂度理解

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

在这里插入图片描述

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

  • O(1) 一次就够 (数量级)
  • O(n) 和传输的数据量一样 (数量级)
  • O(n^2) 数据量的平方 (数量级)
  • O(logn) 数据量的对数 (数量级)
  • O(n logn) 数据量 数据量的对数 (数量级)

O(1)代码示例

function fn(obj = {}) {
    // O(1)
    return obj.a + obj.b + obj.c // 4-5
}

以上代码没有循环,从对象取一个属性算一次计算量,做加分算一次计算量,都是属于常量级别的数量级,即O(1)。

O(n)代码示例

function fn(arr = []) {
    // O(n)
   for (let i = 0; i < arr.length; i++) {
       console.info(arr[i])
   }
}

以上代码的计算量和数组长度成正比,长度是10,计算量就是10,所以这里的计算量是O(n)。

O(n^2)代码示例

function fn(arr = []) {
    // O(n^2)
   for (let i = 0; i < arr.length; i++) {
       for (let j = 0; j < arr.length; j++) {
           console.info(arr[j])
       }
   }
}

以上代码并无实际意义,只谈论计算量,这里是双层循环,当外层循环一次,内层循环n次;当外层循环n次,内层循环n * n次,所以这里的计算量是O(n^2)。

O(logn)代码示例

其实就是一个二分计算

O(n * logn) 代码示例

就是一个循环嵌套一个二分运算

3、空间复杂度 - 程序执行时需要的内存空间

  • O(1) 有限的、可数的空间 (数量级)
  • O(n) 和输入的数量级相同的空间 (数量级)

O(1) 代码示例

function fn (arr = []) {
    // O(1)
    const a = arr[1]
    const b = arr[2]
    // ...
}

在这里这种平铺直叙的给变量分配一个空间,它的复杂度就是O(1)。

O(n) 代码示例

function fn(arr = []) {
    const arr2 = [];
    
    for(let i = 0; i < arr.length; i++) {
        arr2[i] = arr[i] + 10
    }
    // ...
}

这里可以看出定义的数组arr2的空间大小与arr的长度成正比的关系,所以这里的空间复杂度是O(n)。

程序员必须掌握算法复杂度

  • 如果你没有复杂度的概念和敏感度,写程序是非常危险的
  • 例如,代码功能测试正常,但数量大了,程序就会崩溃
  • 对应前端开发,尤其注重时间复杂度(前端:重时间,轻空间)
相关文章
|
6月前
|
算法 Java 程序员
认识复杂度、对数器、二分法
认识复杂度、对数器、二分法
59 1
|
6月前
|
算法 程序员
【算法训练-二分查找 三】【特殊二分】寻找峰值
【算法训练-二分查找 三】【特殊二分】寻找峰值
57 0
|
机器学习/深度学习 存储 算法
|
3月前
|
监控 算法
|
5月前
|
存储 机器学习/深度学习 并行计算
95% 的算法都是基于这 6 种算法思想 (详细介绍)
95% 的算法都是基于这 6 种算法思想 (详细介绍)
122 4
|
6月前
|
搜索推荐 算法 大数据
13.经典 O(nlogn) 复杂度算法之快排
13.经典 O(nlogn) 复杂度算法之快排
149 1
|
6月前
|
算法 Java C++
非启发式算法——二分、三分搜索算法
非启发式算法——二分、三分搜索算法
214 0
|
6月前
|
搜索推荐 算法 大数据
经典 O(nlogn) 复杂度算法之快排
经典 O(nlogn) 复杂度算法之快排
55 0
|
机器学习/深度学习 算法 搜索推荐
算法的时间复杂度详解
算法的时间复杂度详解
326 1
算法的时间复杂度详解
|
存储 自然语言处理 算法
三、算法与算法分析
三、算法与算法分析
三、算法与算法分析