复杂度分析

大 O 记号、常见上限与估时

大 O 记号

描述算法随规模 $n$ 增长的上界,忽略常数和低阶项。

记号 名称 $n=10^5$ 量级
$O(1)$ 常数 极快
$O(\log n)$ 对数 极快
$O(n)$ 线性 通常可行
$O(n \log n)$ 线性对数 排序、分治
$O(n^2)$ 平方 $n \le 5000$ 左右
$O(2^n)$ 指数 $n \le 20\sim 25$

如何估算

  1. 最内层循环执行次数
  2. 递归:写出递推式或层数 × 每层工作量
  3. 多组数据:注意 $\sum n$ 是否与题目限制一致

空间复杂度

数组开多大、递归栈深度、是否用滚动数组优化 DP。

卡常

同样 $O(n \log n)$,常数差 10 倍可能决定 TLE。见「优化技巧」一章。

例题

例 1:估复杂度是否可行
数据 $n \le 10^5$,双重循环 for i for j 枚举所有点对 → $O(n^2)$ 约 $10^{10}$ 次,必 TLE;应改为排序 + 双指针 $O(n \log n)$ 或哈希 $O(n)$。

例 2:多组数据 $\sum n$
「$T$ 组,每组一条长度为 $n$ 的序列,$\sum n \le 10^5$」:单组可写 $O(n^2)$,但所有组合并不能超过 $10^5$,否则总复杂度爆掉。