名词解释教学工作区 · 课程 0003 · 形态 对比组 · 约 5 分钟 · 前置:0002 · 编辑器 / 编译器 / 解释器 / IDE · 2026-10-01

时间复杂度与空间复杂度:同一个算法的两笔账

你能做到:看着一段代码,说清它要花的两笔开销各是什么、分别怎么随数据量长大; 再看到"这个算法 O(n log n)、额外空间 O(n)"这类话,知道它数的是哪种资源、承诺到哪个程度 —— 也明白 O(1) 并不等于"快"。

1 | 定义

这两个词数的是同一个算法的两笔开销,只是数的东西不同:一笔数要做多少件事,一笔数要占多少地方。各给一条正式定义和一句生活说法:

一句话把两者绑在一起:它们都只回答"规模翻倍时会怎么长",答案写成大 O 记法(Big O notation,写作 O(...)),所以换机器、换输入都作数。

2 | 它们解决什么麻烦

这两个词要解决的麻烦只有一个:同一件事有很多种写法,得有一种不依赖具体机器的方式,比出谁更扛得住规模增长。

3 | 特征矩阵

两行都是能一眼看出来的事,不是"它是什么":拿一段代码分别问两列问题,哪一行答得上来,它数的就是哪笔账。

名词 衡量的是什么资源 常见记法 会不会随规模增长 典型取舍 典型例子
时间复杂度 要做的基本操作次数 O(...),只留最高阶那一项 会:数据翻倍,操作次数通常跟着涨 用时间换空间:少占内存,宁可多算几遍 按下标取数组元素 O(1);线性查找 O(n);哈希表(hash table)平均 O(1)、最坏 O(n)
空间复杂度 运行时额外占用的内存峰值 同一套 O(...) 不一定:原地写法可以完全不涨 用空间换时间:多开一张表,换少算几遍 原地交换 O(1);递归深度 n 的调用栈 O(n)

"会不会随规模增长"这一列两行正好相反,是两笔账最容易混的地方。哈希表还顺带说明另一件事:同一个结构可以同时有平均 O(1) 与最坏 O(n) 两个量级,因为口径不同。

两行共用一套读法:大 O 记法写的是增长趋势,不是具体数字,所以换机器、换输入它都不变。

4 | 各自怎么做

5 | 各自的代价

6 | 区分使用场景

先把这一句话归位:它在数操作次数,还是在数内存占用。前者是时间那一侧,后者是空间那一侧。

再按手头这件事挑,每条都落在一侧:

两笔账不是二选一,多数时候是拿一换一。反过来也提醒一句:能提前算好的,就别留到每次都要用的时候再算。

7 | 常见误解

8 | 练习

三题自测,每题只有一个正确选项;选完立刻看到解释。

1. 要挑两个排序写法,只问一句"数据量翻倍时,它要做的比较次数怎么长",不问机器快慢 —— 用的是哪一笔账?

对。数的是操作次数怎么随数据量长,这就是时间复杂度;它不回答机器快慢,也不回答内存占用。

2. 一个算法运行时要额外开一块跟数据量一样大的临时表,想描述这块内存随数据量怎么长,该用哪个词?

对。数的是额外内存的峰值,属于空间那一侧;输入本身占的那一份不算,临时开的表要算。

3. 把 3n² + 100n + 5000 写成 O(n²) 时,被丢掉的 100n 和 5000 都不随数据量变化 —— 这类量统称什么?

对。它们不含 n,不随规模长,所以被扔掉。反过来也说明:数据量小时,决定快慢的恰恰是它们。