同一算法在不同输入下的执行时间可能差异很大,因此需要区分三种情况来刻画性能:
均摊分析(Amortized Analysis):分析一系列连续操作的总代价再除以操作次数。单次操作可能很贵,但平均下来很便宜。它针对的是"操作的序列",与针对"单次操作不同输入"的平均情况不同。
例:动态数组(如 C++ vector)在容量满时扩容为 2 倍并复制。设第 $i$ 次扩容复制 $2^{i-1}$ 个元素,则 $n$ 次 push 的总复制代价为 $1+2+4+\dots+2^{\lceil\log_2 n\rceil} = O(n)$,均摊到每次 push 为 $O(1)$。
| 复杂度类型 | 含义 | 分析依据 | 用途 |
|---|---|---|---|
| 最好 $T_{\text{best}}$ | 最优输入的代价 | 下界 | 了解算法最佳性能 |
| 最坏 $T_{\text{worst}}$ | 最差输入的代价 | 上界 | 保证性能上限,最常用 |
| 平均 $T_{\text{avg}}$ | 所有输入的期望代价 | 概率加权 | 反映实际表现 |
| 均摊 $T_{\text{amortized}}$ | 一系列操作的平均代价 | 总代价/操作数 | 分析连续操作效率 |
| 考法 | 解题套路 |
|---|---|
| 求最好/最坏/平均 | 找最好输入(最少比较)与最坏输入(最多比较) |
| 判断说法正误 | "$O(n)$ 是最坏"→正确;"是平均"→需具体分析 |
| 比较不同算法 | 列表对比各算法在三种情况下的复杂度 |
| 均摊分析 | 算 $n$ 次操作总代价,再除以 $n$ |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。