由数据范围反推算法复杂度以及算法内容
转载来源 (AcWing)
一般的题目时间限制是1s。
在这种情况下,C++代码中的操作次数控制在 \(10^{7}\)为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
- \(n≤30\)
- 指数级别
- DFS+剪枝
- 状态压缩dp
- \(n≤100\) : \(O\)( \(n^{3}\) )
- Floyd
- dp
- \(n≤1000\) : \(O\)( \(n^{2}\)),\(O\)( \(n^{2}logn\) )
- dp
- 二分
- 朴素Dijkstra
- 朴素Prim
- Bellman-Ford
- \(n≤10000\) : \(O\) (\(n^{\frac{3}{2}}\)) \(==\) \(O\) (\(n\sqrt{n}\))
- 块状链表
- \(n≤ 10^{5}\) : \(O\)(\(nlogn\))
- 快速排序,归并排序
- 线段树
- 树状数组
- set/map
- 堆
- Dijkstra+堆优化
- Prim+堆优化
- SPFA
- 求凸包
- 求半平面交
- 二分
- \(n≤10^{6}\) : \(O\)(\(n\)),以及常数较小的\(O\)(\(nlogn\))算法
- 并查集
- hash
- 双指针扫描
- KMP
- AC自动机
-
- 常数比较小的\(O\)(nlogn)的算法:sort、树状数组、堆、Dijkstra+堆优化、SPFA
- \(n≤10^{7}\) : \(O\)(\(n\))
- 双指针扫描
- KMP
- AC自动机
- 线性筛素数
- \(n≤10^{9}\) : \(O\)(\(\sqrt{n}\))
- 判断质数
- \(n≤10^{18}\) : \(O\)(\(logn\))
- 最大公约数
- 快速幂(矩阵快速幂)