复杂度描述输入规模增长时资源消耗的趋势,而不是程序精确运行秒数。Big O 给出渐近上界,分析时通常忽略常数和低阶项,因此 3n+20 记作 O(n),但工程上常数、缓存和数据分布仍会影响真实表现。

顺序语句复杂度相加后取主导项;独立嵌套循环通常相乘;每轮将规模减半的循环是 O(log n)。不过不能只数循环层数:内层若总共只移动 n 次,双层写法仍可能是 O(n)。递归可画递归树:二分每层一个规模减半的问题,共 log n 层;归并每层总工作量为 n,有 log n 层,所以是 O(n log n)

空间复杂度只统计随输入增长的额外空间。固定数量变量是 O(1);长度为 n 的辅助数组是 O(n);递归即便没有容器,也要计算调用栈。例如深度为 n 的递归占 O(n) 栈空间,平衡树递归深度通常为 O(log n)。输出本身是否计入,要在表达时说明口径。

最好、平均和最坏复杂度不可混为一谈。哈希表查询平均接近 O(1),碰撞严重时可能退化;快速排序平均 O(n log n),极端分区会到 O(n²)。摊还分析则把偶尔昂贵的扩容分摊到多次操作,动态数组追加因而可称摊还 O(1)

误区包括把 O(2n) 写成 O(2n)、认为 Big O 小就一定更快、忽略库函数成本,以及把输入占用误算为额外空间。小结:先确定规模变量,再数基本操作和峰值额外存储,最后明确分析口径。