news 2026/8/1 4:49:37

空间复杂度,空间优化思路是极简

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
空间复杂度,空间优化思路是极简

空间复杂度 O(n) = 算法执行过程中额外申请的存储空间,不包括输入数据

空间优化技术,从空间复杂度的角度进行空间优化时,顾名思义,就是让空间复杂度不复杂,思路就是极简:不额外申请,不留的销毁/释放,只留当前所需,不得不留的压缩

什么是空间复杂度?

数组arr 有 1 亿个元素,都叫total。

那么,数组的空间复杂度:O(1)

因为不管 arr 有 1 个元素还是 1 亿个,total 就一个变量。

for x in arr: total += x return total # 空间复杂度 O(1):不管 arr 多大,total 始终一个变量

包含一亿个 int的 数组:

  • 空间复杂度(算法层面):O(1)(没开新数组)
  • 数组本身占用内存:1 亿 × 4 字节 = 400 MB(跟算法无关),实际占的物理空间叫footprint,不等于空间复杂度。

又开个等长数组呢?

空间复杂度变成O(1亿)了,因为额外开了个和输入一样大的数组。

def copy(arr): return [x for x in arr] # 空间复杂度 O(n):额外开了一个等长数组

算法的空间复杂度O(n):就是给这个算法额外申请多大空间

快速排序的空间复杂度:O(log n)—— arr 是输入,不算;递归栈是额外开的,算。

随着递归分区,栈层数加深,后进先出,弹出后栈帧销毁,递归栈呆着的内存空间是额外申请的。

def quicksort(arr): quicksort_helper(arr, 0, len(arr)-1) # 递归栈

给这个递归栈申请多大空间呢?

上面知道数组的空间复杂度是O(1),分区1次,栈层数+1,平均情况下O(log n)层,那么快速排序需要的临时空间——平均空间复杂度就是O(log n)。最坏空间复杂度是O(n²)。

数据实际占的空间"有没有用?

有用!但它在另一个层面叫"内存占用 / footprint",不叫"空间复杂度"。

工程上关心的几个真实指标:

指标含义例子
字面量空间数据结构实际占的字节struct Node { int val; Node* next; }占 16 字节
空间复杂度算法额外开的空间递归栈、临时数组
驻留集(RSS)进程实际占的物理内存top命令
对象头开销每个对象的元数据Java开销小,Python开销大

整个算法占用的空间≈数据结构实际占的字节+算法额外开的空间+进程实际占的物理内存+每个对象的元数据

常见算法 / 数据结构复杂度速查表

1、基础数据结构
数据结构 / 操作时间(平均)时间(最坏)空间适用场景
数组按下标访问O(1)O(1)O(n)随机访问
顺序查找O(n)O(n)O(1)无序线性查找
二分查找O(log n)O(log n)O(1)有序数组
冒泡 / 选择 / 插入排序O(n²)O(n²)O(1)小数据、教学
归并排序O(n log n)O(n log n)O(n)稳定排序、大数据
快速排序O(n log n)O(n²)O(log n)通用排序首选
堆排序O(n log n)O(n log n)O(1)原地排序、Top K
哈希表查找O(1)O(n)O(n)键值映射
BST(二叉搜索树)O(log n)O(n)O(n)有序数据
AVL / 红黑树O(log n)O(log n)O(n)平衡有序
B 树 / B+ 树O(log n)O(log n)O(n)磁盘存储、数据库索引
跳表O(log n)O(n)O(n)有序集合、Redis
Trie(前缀树)O(m)O(m)O(Σ·m)字符串前缀、自动补全
并查集(路径压缩)O(α(n)) ≈ O(1)O(log n)O(n)连通性问题
2、按问题选数据结构的决策树(速记)

同一个问题,不同数据结构空间差很多:存 1000 个点、10000 条边的图:

  • 邻接表:O(V+E) = 1.1 万
  • 邻接矩阵:O(V²) = 100 万

差了将近 100 倍,所以稀疏图千万别用邻接矩阵。

需求
查第 K 大 / 动态 Top K
范围求和 + 单点修改树状数组 / 线段树
前缀匹配Trie
连通性判断并查集
最短路Dijkstra / SPFA
字符串匹配KMP / Z 算法
区间最值ST 表 / 线段树
缓存 / 键值查找哈希表 + LRU

充分理解空间复杂度有什么用?

可以从空间复杂度角度进行空间优化。

空间优化思路是,极简不浪费!不额外申请,不留的销毁/释放,只留当前所需,不得不留的压缩。

常用的空间优化技术有:

  • 滚动数组:在动态规划中只保留当前计算所需的前几行/列数据,而非整个二维表格,将空间从 O(n²) 降至 O(n)。
  • 状态压缩:用位运算等技巧将多维状态压缩到一维,或将状态用整数表示,减少存储开销。
  • 推导式 / 递推:数据边用边销毁,不保留中间完整副本,例如流式处理或迭代计算。
  • 局部变量作用域及时释放临时变量,避免不必要的长生命周期占用内存。
  • 原地算法:直接在输入数据上修改,不额外申请等规模存储空间。
  • 数据分块 / 懒加载加载当前需要处理的数据块,而非一次性载入全部数据。

@fivebliss

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

软件到硬件的“虚拟映射”(Software-to-Hardware Virtual Mapping)是上位机系统中的核心技术,也是数字孪生(Digital Twin)在工业现场落地的具体实现方式

软件到硬件的“虚拟映射”(Software-to-Hardware Virtual Mapping)是上位机系统中的核心技术,也是数字孪生(Digital Twin)在工业现场落地的具体实现方式。它通过软件中的虚拟模型实时、双向映射真实硬件状态与行为,实现“虚实同步、预测优化、闭环控制”。 1. 核心概念 …

作者头像 李华
网站建设 2026/8/1 4:46:31

C 语言指针核心知识点梳理

C语言指针知识点总结 目录 一、指针功能二、基础概念 1. 地址2. 指针3. 指针变量 三、指针两大运算符 1. & 取地址运算符2. * 取值(解引用)运算符 四、指针变量定义 野指针空指针指针类型含义 五、指针两种操作含义六、指针算术运算七、函数参数&a…

作者头像 李华
网站建设 2026/8/1 4:46:01

磁吸充电宝推荐:传应自带线磁吸过关

推荐一块磁吸充电宝,标准就一条:安全底线先立住,体验才有意义。南孚传应自带线磁吸充电宝把这条做在了前面。传应品牌完成首批符合2026新国标3C认证,依据GB47372—2026及新版3C规则过关,推荐理由先有了官方背书。 自带…

作者头像 李华
网站建设 2026/8/1 4:44:27

2026年苹果打包证书最新申请指南

2026年苹果开发者中心申请证书的操作有一点变化,用户登录后,不是直接进入到开发者后台,而是还在前端页面。今天,我针对2026年,苹果打包证书的生成,做一个详细的指南。 苹果打包证书的申请,是在…

作者头像 李华
网站建设 2026/8/1 4:40:36

51单片机中断系统全解析:从硬件原理到C语言/汇编实战编程

1. 项目概述:为什么51单片机的中断如此重要?如果你玩过51单片机,或者正在入门嵌入式开发,那你一定绕不开“中断”这个概念。我第一次接触中断时,感觉它就像单片机里的一个“紧急呼叫按钮”。想象一下,你正在…

作者头像 李华
网站建设 2026/8/1 4:40:14

多模型协作编程:Grok、DeepSeek、GLM在AI开发中的集成实践

最近在AI编程领域,一个明显的趋势正在形成:单一模型已经无法满足复杂开发需求,多模型协作正在成为提升开发效率的关键。如果你还在纠结该选择DeepSeek还是GLM,或者苦恼于Grok的信息获取能力,那么这篇文章将为你展示一个…

作者头像 李华