尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
数据结构.1时间与空间复杂度
文章目录1. 算法效率1.1 什么是时间复杂度1.2 常见结构的基本复杂度1.2.1 O(1)1.2.2 O(n)1.2.3 O(n²)1.2.4 O(log n)1.2.5 O(n log n)2. 什么是空间复杂度2.1 计算空间复杂度的三条前提前提一只算额外空间前提二看峰值不看累计前提三递归栈也要算2.2 O(1)2.3 O(n)2.4 空间复杂度速查表2.5 时间与空间的权衡3. 小结1. 算法效率当我们评价一个算法的优劣时通常会通过算法效率来评估。算法效率分为两部分时间效率算法运行时耗费的时间空间效率算法运行过程中额外耗费的存储空间但由于运行环境电脑性能、编程语言、编译器优化存在差异同一份代码在不同机器上的实际耗时可能相差几十倍直接测量并不可靠。因此我们通常采用事前分析估算的方法由此引出时间复杂度和空间复杂度。1.1 什么是时间复杂度通俗地讲时间复杂度就是当输入数据量变大时这段代码的运行时间增长得有多快。它不关心「跑一次要几秒」只关心「数据量翻倍时时间涨几倍」。常见从小到大排列O(1) O(log n) O(n) O(n log n) O(n²) O(n³) O(2ⁿ) O(n!)1.2 常见结构的基本复杂度代码结构操作次数复杂度几条语句与 n 无关常数O(1)for (i 0; i n; i)套一层nO(n)两层都跑 n 次n × nO(n²)每层 n但内层只跑到一半n²/2O(n²)每次砍一半n→n/2→n/4log₂nO(log n)1.2.1 O(1)与 n 无关的固定几条语句。voidswap(int*a,int*b){inttemp*a;*a*b;*btemp;}intis_leap(intyear){return(year%40year%100!0)||year%4000;}1.2.2 O(n)单层循环intfind_max(int*arr,intn){intmax_valarr[0];// 1 次for(inti0;in;i)// n 次if(arr[i]max_val)// 每次 1 次比较max_valarr[i];// 偶尔 1 次returnmax_val;}递归intsum_to_n(intn){if(n0)return0;returnnsum_to_n(n-1);}1.2.3 O(n²)两层都跑满for(inti0;in;i)for(intj0;jn;j)count;// n × n n² 次内层只跑一半for(inti0;in;i)for(intji;jn;j)count;// n (n-1) … 1 n(n1)/2 次1.2.4 O(log n)每轮折半intcount0;intxn;while(x0){count;x/2;}1.2.5 O(n log n)外层 n 次 内层折半for(inti0;in;i){// 外层 n 次intxi;while(x0){// 内层 log i 次count;x/2;}}2. 什么是空间复杂度和时间复杂度类似空间复杂度也采用事前分析估算的方法衡量的是当输入规模 n 增大时算法额外占用的内存增长得有多快。计算方法与时间复杂度基本一致但有三条特有规则。2.1 计算空间复杂度的三条前提前提一只算额外空间默认不计入输入数据本身只算算法为了完成计算而额外申请的空间即辅助空间auxiliary space。intfind_max(int*arr,intn){intmax_valarr[0];// 唯一的额外变量for(inti0;in;i)if(arr[i]max_val)max_valarr[i];returnmax_val;}输入arr占O(n)但那是输入自带的。算法额外只用 1 个变量故空间复杂度为O(1)。前提二看峰值不看累计voidrun(intn){int*amalloc(n*sizeof(int));// 申请 n 个free(a);int*bmalloc(n*sizeof(int));// 再申请 n 个free(b);}累计申请了2n个元素但任何时刻最多只有 n 个同时存在所以空间复杂度是O(n)而不是O(2n)。前提三递归栈也要算intfact(intn){if(n1)return1;returnn*fact(n-1);}函数里只有一个参数看似O(1)实际是O(n)。因为每层递归都要把参数、返回地址、局部变量压入调用栈n 层调用同时存在栈深度 n故空间复杂度为O(n)。2.2 O(1)只使用固定几个变量称为原地in-place算法。voidswap(int*a,int*b){intt*a;*a*b;*bt;}voidreverse(int*arr,intn){inti0,jn-1;while(ij){inttarr[i];arr[i]arr[j];arr[j]t;i;j--;}}不论 n 是 10 还是 1000 万额外内存始终是几个字节故为O(1)。冒泡、插入、选择、堆排序都是O(1)空间的原地排序这是它们的重要优势。2.3 O(n)辅助数组int*copy_array(int*src,intn){int*dstmalloc(n*sizeof(int));for(inti0;in;i)dst[i]src[i];returndst;}新数组包含 n 个元素故为O(n)。递归深度为 nintsum_rec(intn){if(n0)return0;returnnsum_rec(n-1);}这里的分析重点不是时间而是空间时间每层做一次加法共 n 层 →O(n)空间n 层栈帧同时存在 →O(n)注意同一个函数可以有两个不同的复杂度。时间看「调用了多少次」空间看「同时存在多少层」。这正是 1.2.2 与 2.4 使用相似代码的原因。2.4 空间复杂度速查表写法空间复杂度几个局部变量O(1)| 一维数组 n 个元素 |O(n)|| 递归深度为 n |O(n)|2.5 时间与空间的权衡算法设计中时间和空间往往不能同时最优需要取舍因此「用空间换时间」是工程中最常见的优化方向因为内存通常比 CPU 时间便宜。3. 小结时间复杂度数操作次数随 n 的增长趋势。顺序相加、嵌套相乘、分支取最大、递归写递推式最后化简只留最高阶。空间复杂度数额外内存的峰值随 n 的增长趋势。只算额外空间看峰值不看累计递归要算栈深度。两者都是事前估算衡量的是增长趋势而非具体耗时或占用。判断依据是次数不是循环层数系数和常数不影响量级。
RELATED

相关推荐

超越检索:企业 RAG 的生产级系统设计

超越检索:企业 RAG 的生产级系统设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/21 6:11:00
IPv4/IPv6寻址翻译器:从NAT64/DNS64原理到实战配置

IPv4/IPv6寻址翻译器:从NAT64/DNS64原理到实战配置

1. 从一个“翻译官”的困惑说起如果你翻过那本被网络工程师奉为圭臬的《TCP/IP详解》,大概率会在第2章“互联网地址架构”里卡一下。前面讲IPv4地址分类、子网掩码、CIDR,虽然枯燥但还能啃;到了2.5节“有特殊用途的地址”,突然冒出…

📅 2026/10/21 6:06:00
网格EA交易法:带止损纪律的机械仓位管理术

网格EA交易法:带止损纪律的机械仓位管理术

简介:本资源是一份面向中高级外汇交易者的系统性策略文档,聚焦于改进传统网格交易法的缺陷,提出融合MACD与RSI趋势判断、动态网格线触发、双向加仓与亏损控制机制的EA化交易逻辑。适用于MT4平台(如晋峰金银业STP环境)&…

📅 2026/10/21 6:06:00
MORE NEWS

更多资讯

📰

知识工作插件化:构建可编程、可组合的智能工作流底座

1. 项目概述:这不是一个插件,而是一套知识工作者的“操作系统增强层”“knowledge-work-plugins”这个标题乍看像某个开源仓库的命名,但拆开来看——knowledge work(知识工作)、plugins(插件)—…

📰

SQL题目面试避坑指南:从读题拆解到查询优化全链路

写SQL题目刷了几年,也帮不少同学备过面试、带过新人,我最大的感受是:多数人不是不会写SQL,而是根本不知道一道SQL题目到底在考察什么。同一个查询,有人三行搞定,有人磨叽半小时还漏了边界;同一张…

📰

知识工作插件:面向知识工作者的模块化增强协议

1. 项目概述:这不是一个插件,而是一套知识工作者的“操作系统增强层”“knowledge-work-plugins”——光看这个名字,很多人第一反应是“又一个浏览器插件合集”或者“某款笔记软件的扩展包”。但在我过去三年深度参与多个知识管理系统的搭建与…

📰

SchoolDB四表DDL全解析:数据库设计从字段选择到约束实践

最近给团队做内部培训,我又把一套用了很多年的教学示例库脚本翻了出来——SchoolDB。场景很简单:一个学校管理系统,只有4张表:学生、教师、课程、选课。很多人觉得写DDL语句没什么技术含量,敲几行CREATE TABLE谁不会&a…

📰

订单表慢SQL优化实战:联合索引、覆盖索引与深分页方案

1. 场景回顾:慢SQL是怎么暴露出来的做订单系统的同学应该都有体会:订单表往往是整个业务库里面数据量增长最快、查询模式最多样、索引也最容易“被用坏”的一张表。这个实战项目来自某电商平台的中台订单模块,核心表trade_order存放全渠道的订…

📰

Python实战英雄联盟胜率预测:从数据清洗到SHAP模型解释

简介:LeaguePredictor 是一套面向电子竞技数据分析初学者与机器学习实践者的 Python 项目源码,聚焦英雄联盟比赛胜率预测这一具体场景,帮助读者理解如何把分类模型落地到真实赛事数据上。资源包共 24 个文件,以 22 个 py 脚本为主…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬