由数据范围反推目标算法
由数据范围反推目标算法
在C++中,代码操作次数控制在 10 7 ∼ 10 8 10^7 \sim 10^8 107∼108 为最佳。以下是根据题意中不同数据范围下的时间复杂度与算法选择:
1. n < 30 n < 30 n<30
- 时间复杂度:指数级别( O ( 2 n ) O(2^n) O(2n), O ( n ! ) O(n!) O(n!) 等)
- 推荐算法:
- DFS + 剪枝
- 状态压缩DP
2. n ≤ 100 n \leq 100 n≤100
- 时间复杂度: O ( n 3 ) O(n^3) O(n3)
- 推荐算法:
- Floyd算法(最短路)
- 动态规划(DP)
- 高斯消元
3. n ≤ 1000 n \leq 1000 n≤1000
- 时间复杂度: O ( n 2 log n ) O(n^2 \log n) O(n2logn)
- 推荐算法:
- 动态规划(DP)
- 二分查找
- 朴素Dijkstra、朴素Prim、Bellman-Ford
4. n ≤ 10000 n \leq 10000 n≤10000
- 时间复杂度: O ( n n ) O(n \sqrt{n}) O(nn)
- 推荐算法:
- 块状链表
- 分块处理
- 莫队算法
5. n ≤ 10 5 n \leq 10^5 n≤105
- 时间复杂度: O ( n log n ) O(n \log n) O(nlogn)
- 推荐算法:
- 排序算法(sort)
- 线段树、树状数组
- 堆(priority_queue)、拓扑排序
- Dijkstra + 堆优化、Prim + 堆优化、Kruskal
- SPFA、凸包计算、半平面交
- 二分、CDQ分治、整体二分、后缀数组、树链剖分、动态树
6. n ≤ 10 6 n \leq 10^6 n≤106
- 时间复杂度: O ( n ) O(n) O(n) 或 低常数 O ( n log n ) O(n \log n) O(nlogn)
- 推荐算法:
- 单调队列、哈希表、双指针扫描
- BFS、并查集、KMP、AC自动机
- 低复杂度算法:快速排序、树状数组、堆优化Dijkstra、SPFA
7. n ≤ 10 7 n \leq 10^7 n≤107
- 时间复杂度: O ( n ) O(n) O(n)
- 推荐算法:
- 双指针扫描
- KMP、AC自动机
- 线性筛素数
8. n ≤ 10 9 n \leq 10^9 n≤109
- 时间复杂度: O ( n ) O(\sqrt{n}) O(n)
- 推荐算法:
- 质数判定
9. n ≤ 10 18 n \leq 10^{18} n≤1018
- 时间复杂度: O ( log n ) O(\log n) O(logn)
- 推荐算法:
- 最大公约数(GCD)
- 快速幂
- 数位DP
10. n ≤ 10 1000 n \leq 10^{1000} n≤101000
- 时间复杂度: O ( ( log n ) 2 ) O((\log n)^2) O((logn)2)
- 推荐算法:
- 高精度运算(加减乘除)
11. n ≤ 10 100000 n \leq 10^{100000} n≤10100000
- 时间复杂度: O ( log k ⋅ log log k ) O(\log k \cdot \log \log k) O(logk⋅loglogk)( k k k 为位数)
- 推荐算法:
- 高精度加减法
- 快速傅里叶变换(FFT)/ 数论变换(NTT)
总结:
- 小规模数据优先考虑暴力或指数级优化(如剪枝)。
- 中等规模需平衡时间与代码复杂度(如 O ( n 2 log n ) O(n^2 \log n) O(n2logn))。
- 大规模数据必须选择线性或对数复杂度算法(如双指针、并查集)。
- 超大规模需数学优化或特殊数据结构(如FFT、数位DP)。