时间 / 空间 复杂度
2025年2月14日大约 3 分钟
1. 什么是时间/空间复杂度?
时间复杂度和空间复杂度是用于时间复杂度和空间复杂度是用于评估算法效率的两个重要指标,它们帮助我们量化算法在不同输入规模下的资源消耗情况。,它们帮助我们量化算法在不同输入规模下的资源消耗情况。
总结
时间复杂度:看操作次数如何随 n 增长。
空间复杂度:看额外内存如何随 n 增长。
核心目标:设计在时间和空间上均高效的算法,尤其在大数据场景下至关重要。
2. 时间复杂度(Time Complexity)
定义:表示算法运行所需的时间与输入数据规模(通常记为
n
)之间的增长关系。核心思想:不计算实际时间,而是通过 操作次数的增长趋势 来判断效率。用大 O 符号(如
O(n)
)表示。常见类型:
- O(1):常数时间。无论输入多大,操作次数固定(如数组随机访问)。
- O(log n):对数时间。操作次数随
n
呈对数增长(如二分查找)。 - O(n):线性时间。操作次数与
n
成正比(如遍历数组)。 - O(n²):平方时间。操作次数与
n²
成正比(如双重循环的冒泡排序)。 - O(2ⁿ):指数时间。操作次数呈指数增长(如穷举所有子集)。
示例:
# O(n) 时间复杂度:遍历长度为 n 的数组 for num in array: print(num) # O(n²) 时间复杂度:双重循环 for i in range(n): for j in range(n): print(i, j)
2. 空间复杂度(Space Complexity)
定义:表示算法运行所需的额外内存空间与输入规模
n
的增长关系。核心思想:计算算法使用的 额外存储空间 (不包括输入数据本身占用的空间)。
常见类型:
- O(1):常数空间。仅使用固定数量的变量(如交换两个数的值)。
- O(n):线性空间。额外空间与
n
成正比(如复制一个数组)。 - O(n²):平方空间。额外空间与
n²
成正比(如二维矩阵的生成)。
示例:
# O(1) 空间复杂度:交换两个变量 a, b = b, a # O(n) 空间复杂度:生成一个长度为 n 的数组 new_array = [0] * n
3. 空间与时间的权衡
我们希望算法既高效(时间复杂度低)又节省空间(空间复杂度低),但实际上这两者往往是对立的。当优化其中一个时,往往会导致另一个方面的开销增加。因此,理解和应对这种权衡是设计高效算法的重要技巧。
空间换时间:使用更多的内存来加速计算。
时间换空间:通过减少内存使用来降低计算效率。
典型案例
哈希表是一种典型的通过空间换时间的结构。它可以在常数时间内进行插入、删除和查找操作,即时间复杂度为 O(1),但它需要额外的空间来存储哈希表中的数据。
- 空间换时间:哈希表通常需要额外的存储空间来存储键值对及其哈希值。如果空间较大,查找、插入等操作就能迅速完成。
- 代价:虽然哈希表的查找时间很快,但它需要更多的内存来存储数据。例如,如果数据量较少,但哈希表的桶(buckets)过多,内存会被浪费。
递归算法往往需要大量的栈空间来保存每次递归的状态,尤其是递归深度较大时。递归可以显著简化代码,但它可能导致空间消耗的增加。
- 时间换空间:递归本身可能具有较高的时间复杂度,但通过优化递归(比如尾递归优化)或将其转化为迭代形式,可以减少空间的使用。