封底估算
Cpp 一秒可以计算 次,因此只要最终时间复杂度在 左右,就不会超时,但是常数过大时,也有可能超时。
根据数据大小反推算法
一般 ACM 或者笔试题的时间限制是 1 秒或 2 秒。在这种情况下,C++ 代码中的操作次数控制在 为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
1. 指数级别
- dfs + 剪枝:数字排列, n 皇后问题, 八数码问题,
- 状态压缩 dp:蒙德里安的梦想, 最短 Hamilton 路径
2. ⇒
- floyd,
- dp,
3. ⇒ 、
- dp,
- 二分,
- 朴素版 Dijkstra、朴素版 Prim、Bellman-Ford
4. ⇒
- 块状链表、分块、莫队
5. ⇒
各种 sort,线段树、树状数组、set/map、heap、dijkstra+heap、prim+heap、spfa、求凸包、求半平面交、二分
6. ⇒ 、常数较小的
hash、双指针扫描、并查集,kmp、AC 自动机,
常数比较小的 的做法:sort、树状数组、heap、dijkstra、spfa
7. ⇒
双指针扫描、kmp、AC 自动机、线性筛素数
8. ⇒
判断质数
9. ⇒
最大公约数,快速幂
10. ⇒
高精度加减乘除
11. ⇒
高精度加减、FFT/NTT
算法时间复杂度分析实例
空间复杂度分析
64M
1 Byte = 8 bit
1 KB= 1024 Byte
1 MB=1024*1024 Byte
1 GB=1024 * 1024 * 1024 Byte
int 4 Byte
char 1 Byte
double, long long 6Byte
bool 1 Byte
64MB=2^26Byte
2^26Byte /4 =2^24 int
=1.6*10^7 int
注意 递归也是需要空间的,递归调用了系统栈,快速排序使用了递归,所以空间复杂度是