评估算法效率与时空资源开销的核心工具,NOI/NOIP 竞赛选型必备根基
在算法分析中,我们主要关注随着输入数据规模 $N$ 的增长,算法执行时间的增长趋势(Scale-up behavior)。我们使用 大 O 表示法(Big O Notation) 来忽略低阶项和常数系数,刻画出渐进时间与空间的上界。
在信息学奥赛中,评测机 1 秒钟通常能够执行约 $10^8$ 次基础指令操作。
拖动下方滑块调节数据规模 $N$。观察坐标系中各复杂度曲线的剧烈分化趋势,以及运算耗时计算器上的估算值。
// O(1) 示例:常数级访问
int getElement(int a[], int index) {
return a[index]; // 无论数组多大,哈希或数组下标寻址均为一步到位
}
空间复杂度描述算法执行过程中额外占用的最大物理内存空间。主要分为运行栈深度(递归开销)与堆区存储空间(动态内存分配)。
许多选手有一个极大的认知误区:认为指数级时间复杂度 $O(2^N)$ 的算法,其空间开销也是指数级的。这是完全错误的!
执行 fib(n) 时,虽然递归调用树包含多达 $2^N - 1$ 个节点(时间 $O(2^N)$),但递归在同一时刻只沿着某一条单路径向下探寻到底。
一旦叶子节点返回,该帧立即被弹出栈。因此系统栈的最大深度(空间复杂度)仅仅等于树的最大高度,即 $O(N)$ 级别!
| 存储方案 | 空间复杂度 | 考场选型推荐 |
|---|---|---|
| 一维数组 | O(N) | 开销小,安全优先 |
| 邻接矩阵 (2D) | O(V²) | 极易炸内存 ($V > 10^4$ 绝不可用) |
| 邻接表 (Vector) | O(V + E) | 稀疏图黄金选型,按需拓展 |