当前位置: 首页 > article >正文

算法复杂度:那些神秘符号背后的故事

算法复杂度那些神秘符号背后的故事 开篇为什么需要这套数学语言想象一下你要向朋友描述不同汽车的油耗❌没有统一标准“我的车挺省油的”“他的车特别费油”“那辆车还行吧”✅有统一标准“我的车百公里6升”“他的车百公里12升”“那辆车百公里8升”算法复杂度就是计算机世界的油耗标准让我们能客观比较不同算法的效率 第一部分为什么要发明 O 符号 历史背景1976年计算机科学家Donald Knuth高德纳在他的经典著作《计算机程序设计艺术》中正式引入了大O符号。为什么要发明它问题1同样的算法在不同电脑上速度不一样同一程序运行时间 - 在老电脑上10秒 - 在新电脑上1秒 - 在超级电脑上0.1秒 怎么公平比较问题2数据量不同运行时间也不同排序算法A - 排10个数0.001秒 - 排1000个数0.5秒 排序算法B - 排10个数0.002秒 - 排1000个数0.3秒 哪个算法更好✅ 解决方案关注增长趋势而不是具体时间大O符号的核心思想不关心具体跑多快只关心数据变多时速度会怎样变化 第二部分O、n、log 是怎么来的O- “Order of”数量级O 来自数学中的 “Order”意思是级别或量级正式名称Big O Notation大O记号法 学名渐近上界Asymptotic Upper Bound 简单说O 告诉你算法的天花板有多高为什么用 O 而不用其他字母来自德语 “Ordnung”秩序、等级数学家 Paul Bachmann 在1894年首次使用后来被计算机科学广泛采用n- “number”数量n 代表输入数据的规模为什么用小写 n - 数学传统用 n 表示自然数或计数 - 英文单词number数量、n itemsn个项目 - 约定俗成所有教材都用 n形成标准实际含义排序算法n 要排序的元素个数 搜索算法n 要搜索的范围大小 图算法n 节点或边的数量log- “对数”Logarithmlog 是数学家 John Napier 在1614年发明的 为什么叫对数英文Logarithm 拆解logos比例 arithmos数字 中文翻译对数 对应的指数 直观理解 loglog 回答这个问题需要乘以/除以多少次才能达到目标// log₂(8) 3 的意思2×2×28乘了3次 或者8÷2÷2÷21除了3次// 在计算机中常用的是 log₂以2为底因为计算机喜欢二分法每次排除一半 为什么排序算法中经常出现 log n因为聪明的算法都在用分治法Divide and Conquer例子从1000个数中找一个数 ❌ 笨方法O(n)逐个检查最多查1000次 ✅ 聪明方法O(log n) 第1次排除500个剩500个 第2次排除250个剩250个 第3次排除125个剩125个 ... 只需 log₂(1000) ≈ 10 次 第三部分这些公式是怎么计算出来的1️⃣O(1)- 常数时间怎么看出来的functiongetFirst(arr){returnarr[0];// 只有1步操作}// 不管数组多大都是1步 → O(1)设计原理操作次数不随 n 变化数学表达f(n) 1简化为O(1)2️⃣O(n)- 线性时间怎么看出来的functionsum(arr){lettotal0;for(leti0;iarr.length;i){// 循环n次totalarr[i];}returntotal;}// 数组有n个元素就要加n次 → O(n)设计原理操作次数 n数学表达f(n) n简化为O(n)3️⃣O(n²)- 平方时间怎么看出来的functionbubbleSort(arr){for(leti0;iarr.length;i){// 外层n次for(letj0;jarr.length-1;j){// 内层n次if(arr[j]arr[j1]){swap(arr[j],arr[j1]);}}}}// 嵌套循环n × n n² → O(n²)设计原理操作次数 n × n n²数学表达f(n) n²简化为O(n²)4️⃣O(log n)- 对数时间怎么看出来的functionbinarySearch(arr,target){letleft0,rightarr.length-1;while(leftright){letmidMath.floor((leftright)/2);if(arr[mid]target){returnmid;}elseif(arr[mid]target){leftmid1;// 只在右半部分找}else{rightmid-1;// 只在左半部分找}// 每次循环搜索范围减半}}// 每次排除一半 → O(log n)推导过程假设需要 k 次操作 第1次n ÷ 2 第2次n ÷ 4 第3次n ÷ 8 ... 第k次n ÷ 2^k 1 解方程n ÷ 2^k 1 得到2^k n 取对数k log₂(n) 所以是 O(log n)5️⃣O(n log n)- 线性对数时间怎么看出来的以归并排序为例functionmergeSort(arr){// 第1步拆分递归 log n 层if(arr.length1)returnarr;letmidMath.floor(arr.length/2);letleftmergeSort(arr.slice(0,mid));// 递归左半letrightmergeSort(arr.slice(mid));// 递归右半// 第2步合并每层需要 n 次操作returnmerge(left,right);}// 分析// - 递归深度log n 层每次减半// - 每层合并n 次操作所有元素都要参与// - 总操作n × log n → O(n log n)可视化理解原始数组: [5, 2, 8, 1, 9, 3, 7, 4] 第1层拆分 ← 第1层 [5,2,8,1] [9,3,7,4] 第2层拆分 ← 第2层 [5,2] [8,1] [9,3] [7,4] 第3层拆分 ← 第3层 [5] [2] [8] [1] [9] [3] [7] [4] 第3层合并 ← 合并8个元素需要n次操作 [2,5] [1,8] [3,9] [4,7] 第2层合并 ← 合并4组需要n次操作 [1,2,5,8] [3,4,7,9] 第1层合并 ← 合并2组需要n次操作 [1,2,3,4,5,7,8,9] 总共 - 拆分了 log₂(8) 3 层 - 每层合并需要 n 8 次操作 - 总计8 × 3 24 次 ≈ n log n数学推导设 T(n) 为排序n个元素的时间 T(n) 2T(n/2) n 解释 - 2T(n/2)递归处理左右两半 - n合并两个有序数组需要n次操作 用主定理Master Theorem求解 T(n) O(n log n)6️⃣快速排序的复杂度分析✅ 最好/平均情况O(n log n)理想情况每次选的队长都在中间 [5, 2, 8, 1, 9, 3, 7, 4] 选队长5 [2, 1, 3, 4] [5] [8, 9, 7] ↓ ↓ 继续分 继续分 递归深度log n 层 每层处理n 个元素 总计n log n❌ 最坏情况O(n²)最坏情况每次选的队长都是最大或最小 [1, 2, 3, 4, 5, 6, 7, 8] 已经有序 选队长1 [] [1] [2, 3, 4, 5, 6, 7, 8] ↓ 选队长2 [] [2] [3, 4, 5, 6, 7, 8] ↓ 继续... 递归深度n 层退化成链表 每层处理n, n-1, n-2, ..., 1 个元素 总计n (n-1) (n-2) ... 1 n(n1)/2 ≈ n² 第四部分为什么这样设计 设计原则1忽略常数因子算法A需要 3n 次操作 算法B需要 100n 次操作 理论上都是 O(n)但实际差距很大啊 ✅ 大O的设计哲学 - 关注增长趋势不是绝对速度 - 常数因子取决于硬件、编译器优化等 - n 很大时n 和 n² 的差距远大于 3n 和 100n 的差距举例当 n 1,000,000 时 - 3n 3,000,000 - 100n 100,000,000 - n² 1,000,000,000,000 看到了吗n² 比 100n 大了1万倍 所以常数因子不重要关键是 n 还是 n² 设计原则2只看最高阶项某个算法的操作次数 f(n) 3n² 100n 50 为什么简化为 O(n²) 因为 n 很大时 - n 1000 3n² 3,000,000 100n 100,000 50 50 3n² 占了99.9%低阶项可以忽略数学依据lim(n→∞) (3n² 100n 50) / n² 3 当 n 趋向无穷大时3n² 主导了整个表达式 设计原则3区分最好、平均、最坏情况为什么要分析三种情况 快速排序例子 - 最好O(n log n) ← 数据随机分布 - 平均O(n log n) ← 大多数情况 - 最坏O(n²) ← 数据已有序且选第一个为队长 实际意义 - 最好情况了解算法潜力 - 平均情况日常使用的预期性能 - 最坏情况保证不会慢于这个界限 设计原则4稳定性的重要性什么是稳定性 相同值的元素排序后保持原来的相对顺序 例子按成绩排序学生 原始[(小明,85), (小红,90), (小刚,85)] 稳定排序结果 [(小明,85), (小刚,85), (小红,90)] ↑小明还在小刚前面保持原顺序 不稳定排序可能 [(小刚,85), (小明,85), (小红,90)] ↑顺序变了 为什么重要 多条件排序时先按班级再按成绩稳定性保证结果正确 设计原则5空间复杂度的权衡时间复杂度算法要多快 空间复杂度算法要多大内存 常见权衡 - 快速排序时间O(n log n)空间O(log n) ← 省空间 - 归并排序时间O(n log n)空间O(n) ← 费空间但稳定 - 插入排序时间O(n²)空间O(1) ← 最省空间 没有完美的算法只有适合场景的选择 第五部分排序算法复杂度对比表算法最好平均最坏空间稳定设计思想快速排序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(n)✅分治法拆分后合并插入排序O(n)O(n²)O(n²)O(1)✅逐个插入已排序序列TimSortO(n)O(n log n)O(n log n)O(n)✅自适应混合策略 第六部分如何自己推导复杂度 步骤1数循环次数// 例1单层循环for(leti0;in;i){console.log(i);}// 执行n次 → O(n)// 例2双层循环for(leti0;in;i){for(letj0;jn;j){console.log(i,j);}}// 执行n×n次 → O(n²) 步骤2看递归深度// 例1二分查找functionbinarySearch(n){if(n1)return;binarySearch(n/2);// 每次减半}// 递归深度log n → O(log n)// 例2归并排序functionmergeSort(n){if(n1)return;mergeSort(n/2);// 左半mergeSort(n/2);// 右半merge(n);// 合并n个元素}// 深度log n每层工作n → O(n log n) 步骤3用主定理Master Theorem适用于分治算法的复杂度计算形式T(n) aT(n/b) f(n) 其中 - a子问题数量 - n/b每个子问题的规模 - f(n)合并操作的代价 常见情况 1. T(n) 2T(n/2) n → O(n log n) 归并排序 2. T(n) 2T(n/2) O(1) → O(n) 遍历二叉树 3. T(n) T(n/2) O(1) → O(log n) 二分查找 第七部分实际应用建议 如何选择排序算法// JavaScriptarr.sort();// 内置排序通常是TimSort或快速排序// Pythonsorted(arr)# TimSort// JavaArrays.sort(arr);// 双轴快速排序基本类型或 TimSort对象// Cstd::sort(arr.begin(),arr.end());// introsort混合排序⚠️ 常见陷阱// ❌ 错误认为 O(n²) 一定比 O(n log n) 慢// 当 n 很小时常数因子更重要if(n50){insertionSort(arr);// O(n²) 但常数小实际更快}else{quickSort(arr);// O(n log n)}// ✅ 正确根据数据特点选择if(isNearlySorted(arr)){insertionSort(arr);// 接近有序时 O(n)}else{mergeSort(arr);// 一般情况 O(n log n)} 总结记住这些就够了 核心概念O 是什么算法效率的度量衡关注增长趋势不是绝对时间n 是什么输入数据的规模要处理的元素个数log n 是什么每次排除一半的操作次数分治法的标志为什么这样设计忽略硬件差异关注可扩展性提供理论上限 实用口诀O(1) → 一步到位雷打不动 O(log n) → 每次减半聪明绝顶 O(n) → 一个不少逐个检查 O(n log n)→ 分治合并排序标配 O(n²) → 双重循环小心变慢 O(2ⁿ) → 能不用就不用太慢了 延伸阅读《算法导论》Introduction to Algorithms- CLRS《计算机程序设计艺术》- Donald Knuth在线可视化工具https://visualgo.net/en/sorting现在你知道了这些看似神秘的符号其实是计算机科学家为了让算法比较更公平、更科学而设计的通用语言。下次看到 O(n log n)你就知道这是在说“这个算法很聪明用了分治法每个元素都要做对数次操作”

相关文章:

算法复杂度:那些神秘符号背后的故事

🔬 算法复杂度:那些神秘符号背后的故事 📖 开篇:为什么需要这套"数学语言"? 想象一下,你要向朋友描述不同汽车的油耗: ❌ 没有统一标准: “我的车挺省油的”“他的车特别费…...

5分钟快速上手:E7Helper第七史诗智能挂机助手完整使用指南

5分钟快速上手:E7Helper第七史诗智能挂机助手完整使用指南 【免费下载链接】e7Helper 【Epic Seven Auto Bot】第七史诗多功能覆盖脚本(刷书签🍃,挂讨伐、后记、祭坛✌️,挂JJC等📛,多服务器支持&#x1f4…...

解锁iOS 17-26.4越狱的3个关键技巧:从新手到专家的完整指南

解锁iOS 17-26.4越狱的3个关键技巧:从新手到专家的完整指南 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder 👇 项目…...

源代码论文分享|基于Java的医院急诊系统!

有些项目一看题目就知道,难度不会太水,也不会空得没东西写。医院急诊系统就是这种类型。它有明确的使用场景,也有比较完整的业务流程,适合用来做 Java 方向的毕业设计或课程项目。 这次分享的是一套关于基于Java的医院急诊系统的…...

魔兽争霸III终极增强方案:WarcraftHelper完整配置与优化指南

魔兽争霸III终极增强方案:WarcraftHelper完整配置与优化指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸III在现代…...

5分钟搭建炫酷企业抽奖系统:Magpie-LuckyDraw完整指南 [特殊字符]

5分钟搭建炫酷企业抽奖系统:Magpie-LuckyDraw完整指南 🎉 【免费下载链接】Magpie-LuckyDraw 🏅A fancy lucky-draw tool supporting multiple platforms💻(Mac/Linux/Windows/Web/Docker) 项目地址: https://gitcode.com/gh_mi…...

2026 收藏版|LangGraph 智能体三大核心工作流,程序员零基础上手大模型开发

本篇全面剖析 2026 主流 LangGraph 智能体三类经典工作流架构,依托任务拆分校验、智能任务分发、多任务并行处理三种思路,全方位提升大模型智能体运行精度与处理效率。每类模式均搭配可直接运行的实战代码案例,贴合新手学习场景,帮…...

收藏备用|2026版35岁程序员转行大模型完整路线,稳妥突破职业瓶颈

步入35岁职业关键期,不少资深程序员都面临发展瓶颈,当下势头迅猛的大模型行业,已然成为打破职业困局的优质新方向。和应届新人零基础摸索不同,在职程序员手握成熟编程功底与项目阅历,具备快速跨界入局的先天优势。本篇…...

大模型---MetaGPT

目录 1.MetaGPT 2.SOP工作流 3.总结 1.MetaGPT 参考论文: [2308.00352] MetaGPT: Meta Programming for A Multi-Agent Collaborative Framework MetaGPT将Standardized Operating Procedures(SOPs)编码进prompt sequence,让不同角色的Agent像流水线一样处理复杂任务…...

第七史诗自动化脚本终极指南:5分钟快速上手E7Helper游戏助手

第七史诗自动化脚本终极指南:5分钟快速上手E7Helper游戏助手 【免费下载链接】e7Helper 【Epic Seven Auto Bot】第七史诗多功能覆盖脚本(刷书签🍃,挂讨伐、后记、祭坛✌️,挂JJC等📛,多服务器支持&#x1…...

描述它,不要画它:通过 MCP 和 ES|QL 实现 AI-native Kibana dashboards

作者:来自 Elastic Stratoula Kalafateli 从 prompt 到 dashboard。学习如何使用自然语言构建 Kibana dashboards,使用 example-mcp-dashbuilder:一个开源 MCP 应用,它可以编写 ES|QL 查询,创建交互式图表,…...

E-ROBOT:融合熵正则化与鲁棒截断的最优传输新框架

1. E-ROBOT框架:从理论动机到核心思想拆解在机器学习和统计学中,我们常常需要比较和度量两个概率分布之间的差异。最优传输(Optimal Transport, OT)为此提供了一个优雅且几何直观的数学框架:它寻找一个“运输计划”&am…...

告别‘薛定谔的网卡’:在Ubuntu 20.04上为RTL8168网卡手动编译驱动并配置开机自启的完整记录

深度解析:Ubuntu 20.04下RTL8168网卡驱动的编译与持久化加载实战当你盯着Ubuntu系统托盘上那个时隐时现的网络图标,或是反复插拔网线却依然无法获得稳定的有线连接时,可能正遭遇着经典的RTL8168网卡驱动问题。这个被开发者戏称为"薛定谔…...

DS4Windows:让PlayStation手柄在Windows上焕发新生

DS4Windows:让PlayStation手柄在Windows上焕发新生 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否曾想过,为什么心爱的PlayStation手柄在PC上总是表现得像个…...

ncmdumpGUI:三步解锁网易云音乐NCM加密文件的完整指南

ncmdumpGUI:三步解锁网易云音乐NCM加密文件的完整指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI ncmdumpGUI 是一款专为Windows平台设计的开源…...

多模态融合在死因推断中的应用:特征级与决策级融合策略对比

1. 项目概述:当AI遇见死因推断,多模态融合如何破局?在公共卫生和流行病学领域,准确推断死因(Cause of Death, COD)是评估疾病负担、制定卫生政策的基础。然而,在资源有限的地区,获取…...

终极魔兽争霸III优化指南:如何使用WarcraftHelper提升游戏体验

终极魔兽争霸III优化指南:如何使用WarcraftHelper提升游戏体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专门为…...

扫地机器人行业 企业篇-科沃斯

科沃斯成立于1998年,早期为海外品牌代工吸尘器,2009年发布全球首款量产扫地机器人"地宝",正式拉开中国扫地机市场序幕。公司为A股上市公司,总部位于苏州,公司性质为民营企业。 2025年全年营收达190亿元&…...

扫地机器人行业 企业篇-石头科技

石头科技成立于2014年,2016年为小米代工推出首款米家扫地机器人,凭借自研LDS激光雷达导航技术快速打开市场。2020年登陆科创板,此后逐步减少对小米的依赖,专注自有品牌Roborock,定位高端市场。公司性质为A股科创板上市公司,总部位于北京。截至2025年6月底,研发人员规模达…...

WarcraftHelper:魔兽争霸3终极优化指南 - 5大方案让你的经典游戏焕发新生

WarcraftHelper:魔兽争霸3终极优化指南 - 5大方案让你的经典游戏焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为《魔…...

量子机器学习对称性工程权衡:Twirlator工具解析与实战指南

1. 量子机器学习中的对称性:从理论到工程实践的权衡在量子机器学习(QML)领域,我们一直在寻找能够提升模型性能、加速训练并增强泛化能力的“银弹”。对称性,这个在经典几何深度学习(Geometric Deep Learnin…...

RFSoC在C波段加速器LLRF系统中的创新应用

1. C波段加速器与RFSoC LLRF系统概述在粒子加速器领域,射频(RF)控制系统的精度直接决定了束流品质。传统低电平射频(LLRF)控制系统采用模拟混频架构,需要大量本地振荡器、混频器和滤波器,导致系…...

Taotoken用量看板与成本分析功能,如何帮助团队控制大模型支出

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken用量看板与成本分析功能,如何帮助团队控制大模型支出 对于任何将大模型能力集成到产品开发流程中的团队而言&a…...

5G O-RAN网络智能运维:基于随机森林的异常检测与切换优化实战

1. 项目概述:当5G网络学会“未卜先知”在5G乃至未来6G网络的运维战场上,故障处理正经历一场从“事后救火”到“事前预警”的深刻变革。传统基于静态阈值的告警系统,就像在高速公路上设置固定的限速牌,一旦遇到雨雪、拥堵等复杂路况…...

WarcraftHelper:魔兽争霸3终极兼容性增强插件完全指南

WarcraftHelper:魔兽争霸3终极兼容性增强插件完全指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为《魔兽争霸…...

如何告别城通网盘龟速下载:三步获取高速直连的终极方案

如何告别城通网盘龟速下载:三步获取高速直连的终极方案 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘那令人抓狂的下载速度而苦恼吗?每次点击下载按钮后&#x…...

OpenSSH regreSSHion漏洞深度解析与零停机修复指南

1. 这个漏洞不是“修一下配置就完事”的普通补丁OpenSSH高危漏洞(CVE-2024-6387)——业内已习惯称它为“regreSSHion”——不是那种改个PermitRootLogin no就能糊弄过去的配置疏漏。我是在凌晨三点被监控告警叫醒的:三台生产跳板机在无任何登…...

如何快速搭建个人小说图书馆:番茄小说下载器完整实战指南

如何快速搭建个人小说图书馆:番茄小说下载器完整实战指南 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾经遇到过这样的问题:想离线阅读喜欢的…...

微信4.0.3.22防撤回技术原理与安全Hook实践

1. 这不是“破解”,而是对微信消息机制的一次技术复盘 很多人看到标题里的“防撤回”三个字,第一反应是“又要搞黑产工具了?”——其实完全不是。我做这个分析的初衷,非常朴素:去年带一个校园小程序团队时,…...

微信网页版终极解决方案:wechat-need-web 完整使用指南

微信网页版终极解决方案:wechat-need-web 完整使用指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 你是否曾经因为微信网页版限制而无…...