news 2026/1/3 9:01:14

JavaScript 常见算法复杂度总结(大O表示法)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript 常见算法复杂度总结(大O表示法)

大O表示法具体含义总结表

时间复杂度详解

大O表示名称含义示例增长曲线执行时间(n=1000)假设
O(1)常数时间执行时间不随输入规模变化数组索引访问、哈希表查找水平线1单位时间
O(log n)对数时间执行时间随输入规模对数增长二分查找、平衡树操作缓慢上升曲线10单位时间
O(√n)平方根时间执行时间随输入规模的平方根增长某些数论算法、质数检查平缓上升31.6单位时间
O(n)线性时间执行时间与输入规模成正比数组遍历、线性搜索45°直线1000单位时间
O(n log n)线性对数时间执行时间 = n × log n高效排序算法(快速排序、归并排序)略高于线性10000单位时间
O(n²)二次时间执行时间与输入规模的平方成正比简单排序(冒泡、选择)、嵌套循环快速上升曲线1,000,000单位时间
O(n³)立方时间执行时间与输入规模的立方成正比三重嵌套循环、某些矩阵运算急剧上升1,000,000,000单位时间
O(2ⁿ)指数时间执行时间呈指数增长暴力破解、汉诺塔递归急剧爆炸增长1.07×10³⁰¹单位时间
O(n!)阶乘时间执行时间呈阶乘增长旅行商问题暴力解、全排列极端爆炸增长4×10²⁵⁶⁷单位时间

复杂度等级对比表

复杂度n=10n=100n=1000n=10000实用性
O(1)1111优秀
O(log n)3.36.61013.3优秀
O(√n)3.21031.6100良好
O(n)10100100010000良好
O(n log n)336649966132877可接受
O(n²)1001000010⁶10⁸小型数据可用
O(n³)100010⁶10⁹10¹²仅限极小数据
O(2ⁿ)10241.27×10³⁰巨大天文数字不可用
O(n!)36288009.33×10¹⁵⁷巨大天文数字完全不可用

空间复杂度详解

大O表示名称含义示例
O(1)常数空间算法使用固定大小的额外空间原地排序、简单变量
O(log n)对数空间额外空间随输入规模对数增长递归算法的调用栈(如快速排序)
O(n)线性空间额外空间与输入规模成正比创建新数组、哈希表存储
O(n log n)线性对数空间额外空间 = n × log n某些递归算法
O(n²)二次空间额外空间与输入规模的平方成正比创建二维数组、邻接矩阵

常见算法的具体数值含义

排序算法示例

// O(n²): 冒泡排序 for (let i = 0; i < n; i++) { // n次 for (let j = 0; j < n - i - 1; j++) { // 平均n/2次 // 比较操作: 总共 ≈ n²/2 次 } } // 实际执行次数: 约 0.5n² 次比较 // O(n log n): 快速排序 // 每次递归将数组分成两半: log n 层 // 每层处理所有元素: n 次操作 // 总操作: n × log n

搜索算法示例

// O(log n): 二分查找 // 每次将搜索范围减半 // 查找次数 = log₂n // 例如: n=1024 → 最多10次查找 // n=100万 → 最多20次查找 // O(n): 线性查找 // 最坏情况: 查找整个数组 // 查找次数 = n

实际性能参考表

操作数量级可接受算法复杂度1GHz CPU处理时间估计
n ≤ 100O(n³), O(2ⁿ) (小规模)< 1秒
100 < n ≤ 10,000O(n²)1秒 - 几分钟
10,000 < n ≤ 1,000,000O(n log n)几秒 - 几分钟
n > 1,000,000O(n), O(log n), O(1)几秒 - 几分钟
n > 10⁹O(log n), O(1)实时或近实时

重要注意事项

  1. 大O表示法忽略常数因子: O(100n) 仍写作 O(n)

  2. 关注最坏情况: 大O通常表示最坏情况复杂度

  3. 实际性能受多种因素影响:

    • 硬件性能

    • 编程语言效率

    • 算法具体实现

    • 输入数据的特性

  4. 复杂度对比的实际意义:

    • O(n) 比 O(n log n) 好10倍以上时,n通常 > 1000

    • O(log n) 在大数据时优势明显

    • 常数因子在n较小时可能起决定性作用


选择算法的指导原则

  1. n < 10: 简单算法即可,复杂度不重要

  2. 10 < n < 1000: 避免O(n³)和更差的算法

  3. 1000 < n < 10⁶: 优先选择O(n log n)或更好的算法

  4. n > 10⁶: 必须使用O(n)或更优算法


记住:大O表示法帮助我们理解算法随数据规模增长的趋势,但在实际开发中需要结合具体场景和性能测试来选择最合适的算法。


JavaScript 常见算法复杂度总结(大O表示法)

以下是JavaScript中常见算法的时间与空间复杂度总结:

时间复杂度表

算法类型最佳情况平均情况最坏情况常见示例
常数时间O(1)O(1)O(1)数组索引访问、对象属性访问
对数时间O(1)O(log n)O(log n)二分查找、平衡二叉搜索树操作
线性时间O(n)O(n)O(n)数组遍历、线性搜索
线性对数时间O(n)O(n log n)O(n log n)快速排序、归并排序、堆排序
二次时间O(n)O(n²)O(n²)冒泡排序、选择排序、插入排序
指数时间O(1)O(2ⁿ)O(2ⁿ)汉诺塔、斐波那契递归解法
阶乘时间O(1)O(n!)O(n!)旅行商问题暴力解法

空间复杂度表

算法类型空间复杂度描述
原地算法O(1)不使用额外空间或使用常量空间
线性空间O(n)额外空间与输入大小成正比
递归算法O(n)递归调用栈的空间消耗

JavaScript常见算法具体分析

1. 搜索算法

算法时间复杂度空间复杂度说明
线性搜索O(n)O(1)遍历数组查找元素
二分搜索O(log n)O(1)要求数组已排序
深度优先搜索(DFS)O(V+E)O(V)图/树遍历,V为顶点数,E为边数
广度优先搜索(BFS)O(V+E)O(V)图/树遍历

2. 排序算法

算法最佳平均最坏空间稳定性
冒泡排序O(n)O(n²)O(n²)O(1)稳定
选择排序O(n²)O(n²)O(n²)O(1)不稳定
插入排序O(n)O(n²)O(n²)O(1)稳定
归并排序O(n log n)O(n log n)O(n log n)O(n)稳定
快速排序O(n log n)O(n log n)O(n²)O(log n)不稳定
堆排序O(n log n)O(n log n)O(n log n)O(1)不稳定

3. 数据结构操作

数据结构访问搜索插入删除空间复杂度
数组O(1)O(n)O(n)O(n)O(n)
栈/队列O(n)O(n)O(1)O(1)O(n)
链表O(n)O(n)O(1)O(1)O(n)
哈希表O(1)*O(1)*O(1)*O(1)*O(n)
二叉搜索树O(log n)*O(log n)*O(log n)*O(log n)*O(n)

注:带号表示平均情况,最坏情况可能退化*


实际应用建议

  1. 小数据集(n < 100):简单算法(如冒泡排序)可能更合适

  2. 中型数据集(n < 10,000):使用O(n log n)算法如快速排序

  3. 大型数据集(n > 10,000):优先考虑O(n log n)或O(n)算法

  4. 内存敏感场景:选择原地算法(空间复杂度O(1))

  5. 需要稳定排序:选择归并排序或插入排序


JavaScript内置方法复杂度

方法时间复杂度说明
Array.prototype.push/popO(1)数组末尾操作
Array.prototype.shift/unshiftO(n)数组开头操作,需要重新索引
Array.prototype.sortO(n log n)V8引擎使用TimSort(归并+插入)
Array.prototype.includes/indexOfO(n)线性搜索
Array.prototype.sliceO(n)需要复制元素
Object.keys/values/entriesO(n)遍历对象属性

记住:大O表示法描述的是算法性能随输入规模增长的趋势,实际性能还受常数因子、硬件特性、JavaScript引擎优化等因素影响。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/31 22:16:03

第六章 染色体变异

第七章细菌和病毒的遗传第八章基因的表达与调控第九章基因工程和基因组学第十章基因突变第十一章细胞质遗传第十二章遗传与发育第十三章数量性状遗传第十四章群体遗传与进化

作者头像 李华
网站建设 2026/1/1 9:38:03

TIME_WAIT详解

一、为什么需要 TIME_WAIT&#xff1f;虽然连接看起来已经可以结束了&#xff0c;但 TCP 设计这个状态主要是为了解决两个核心问题&#xff1a;1. 确保最后一个 ACK 能够到达对方在 TCP 四次挥手中&#xff0c;主动关闭方发送完最后一个确认包&#xff08;ACK&#xff09;后&am…

作者头像 李华
网站建设 2026/1/2 12:53:16

buuctf中的picoctf_2018_rop chain

首先checksec检查保护机制&#xff1a;-32位程序-开启了栈不可执行机制然后使用反汇编工具IDA进行分析&#xff1a;看到了vuln函数和左边的win1&#xff0c;win2函数及flag函数&#xff0c;第一眼看到就觉得能够从这些函数中获取flag&#xff0c;但实际行不行呢&#xff0c;先一…

作者头像 李华
网站建设 2026/1/1 12:45:37

MuJoCo: 开源的高性能物理仿真引擎

文章目录&#x1f50d; 核心特点1. **高效且准确的物理建模**2. **丰富的物理对象与执行器支持**3. **高性能求解与数值方法**4. **易用的建模与可视化**5. **高性能底层实现**&#x1f6e0;️ 典型应用场景&#x1f4e6; 使用方式&#xff08;简要&#xff09;&#x1f4da; 学…

作者头像 李华
网站建设 2026/1/1 12:45:32

男人宠你的 9 个 “藏不住” 本能反应

别人吐槽你&#xff0c;他立马开启“护犊子”模式&#xff0c;怼人都不带打草稿的&#x1f44a;抱抱时像裹粽子&#xff0c;胳膊勒得比安全带还紧&#xff0c;生怕你跑掉&#x1f390;走路自动切换“龟速档”&#xff0c;你走一步他挪半步&#xff0c;主打一个同频贴贴&#x1…

作者头像 李华