什么是时间复杂度和空间复杂度?如何分析大 O 表示法?
时间复杂度描述算法运行时间随输入规模 n 增长的趋势;空间复杂度描述额外内存随 n 增长的趋势。O() 只保留最高阶项并忽略常数系数。
分析步骤:
- 找出随输入规模变化最频繁的操作(基本语句)
- 用
n表达其执行次数 - 取最高阶、去常数
常见量级(由快到慢):
O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(2^n) < O(n!)// O(1):与 n 无关
function first(arr) { return arr[0] }
// O(n):线性扫描
function sum(arr) {
let s = 0
for (const x of arr) s += x // 执行 n 次
return s
}
// O(n^2):嵌套循环
function bubble(arr) {
for (let i = 0; i < arr.length; i++)
for (let j = 0; j < arr.length; j++) { /* ... */ }
}注意:大 O 是「渐进上界」,最坏情况分析最常见;实际还要关注平均情况与常数因子(如 Quick Sort 常数优于 Merge Sort)。