复杂度分析入门

面试必问:你的解法时间复杂度是多少?

什么是复杂度?

复杂度描述了算法执行时间或占用空间如何随输入规模增长而变化。


时间复杂度

常见时间复杂度(从快到慢)

符号 名称 例子
O(1) 常数 数组随机访问
O(log n) 对数 二分查找
O(n) 线性 遍历数组
O(n log n) 线性对数 快速排序、归并排序
O(n²) 平方 双重循环、冒泡排序
O(2ⁿ) 指数 暴力递归(斐波那契)
O(n!) 阶乘 全排列

如何分析?

规则 1:只保留最高阶

# O(n) + O(n²) = O(n²)
for i in range(n):      # O(n)
    pass
for i in range(n):      # O(n²)
    for j in range(n):
        pass

规则 2:忽略常数系数

# O(3n) = O(n)
for i in range(n): pass
for i in range(n): pass
for i in range(n): pass

规则 3:嵌套循环相乘

# O(n * m)
for i in range(n):
    for j in range(m):
        pass

空间复杂度

描述算法额外使用的内存。

符号 例子
O(1) 只用几个变量
O(n) 创建与输入等长的数组
O(n²) 创建 n×n 的矩阵

常见算法复杂度速查

算法 时间 空间
数组遍历 O(n) O(1)
二分查找 O(log n) O(1)
快速排序 O(n log n) O(log n)
归并排序 O(n log n) O(n)
BFS/DFS O(V + E) O(V)

← 返回首页