时空间复杂度笔记
2秒时间限制下的可执行操作数
一般经验估算
- 保守估计:C++在2秒内可执行约 $210^8-410^8$ 次基本操作(加减、比较、赋值等)
- 实际表现:
实战参考表
| 数据规模 | 可接受的复杂度 | 常见算法 |
|---|---|---|
| n ≤ 10 | 任意(包括O(n!)) | 全排列、暴力搜索 |
| n ≤ 20 | O(2ⁿ) | 子集枚举、状态压缩DP |
| n ≤ 100 | O(n³) | Floyd、简单DP |
| n ≤ 1000 | O(n²) | 二维DP、Dijkstra朴素版 |
| n ≤ 10^4 | O(n√n) | 数论分块 |
| n ≤ 10^5 | O(nlogn) | 线段树、树状数组、堆 |
| n ≤ 10^6 | O(n) 或 O(nlogn) | 前缀和、KMP、单调栈 |
| n ≤ 10^7 | O(n) | 筛法、线性DP |
| n ≤ 10^8 | O(n)(必须常数小) | 位运算、简单遍历 |
256MB内存限制下的数组大小
不同数据类型可开数组大小
| 数据类型 | 字节大小 | 最大元素数 | 备注 |
|---|---|---|---|
| bool | 1字节 | 约 2.68亿 | 实际比赛中常设为 bool 数组 |
| char | 1字节 | 约 2.68亿 | |
| int | 4字节 | 约 6700万 | 常用 |
| long long | 8字节 | 约 3300万 | |
| double | 8字节 | 约 3300万 | |
| 结构体(16字节) | 16字节 | 约 1600万 | 视具体结构而定 |
1 | // 安全范围(考虑程序其他部分占用) |
实用安全上限表
| 数组类型 | 推荐最大规模 | 实际内存占用 | 安全系数 |
|---|---|---|---|
| 一维int数组 | ≤ 5×10⁷ | ≤ 200MB | 留有余地 |
| 一维long long数组 | ≤ 2.5×10⁷ | ≤ 200MB | |
| 二维int数组[n][m] | n×m ≤ 3×10⁷ | ≤ 120MB | 常用 |
| 邻接表(图) | 边数 ≤ 2×10⁶ | 变长,通常安全 | |
| 位集bitset | ≤ 2×10⁸位 | ≤ 25MB | 非常节省 |
快速判断方法
时间判断口诀
1 | n=10⁵ → 想想O(nlogn) |
空间判断口诀
1 | int数组:百万级安全,千万级要小心 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ZestfulYK的Blog!