如何根据数据范围,估计题目允许的时间复杂度,从而估计要用什么算法?
一般每秒能执行约 \(10^8\) 次运算(Python 可能要除以 10),可以据此估计能通过的时间复杂度,如下表所示。
数据范围 | 允许的时间复杂度 | 适用算法举例 |
---|---|---|
\(n \leq 10\) | \(O(n!)\) 或 \(O(C^n)\) | 回溯、暴力搜索 |
\(n \leq 20\) | \(O(2^n)\) | 状态压缩 DP |
\(n \leq 40\) | \(O(2^{n/2})\) | 折半枚举 |
\(n \leq 10^2\) | \(O(n^3)\) | 三重循环的 DP、Floyd |
\(n \leq 10^3\) | \(O(n^2)\) | 二重循环的 DP、背包 |
\(n \leq 10^5\) | \(O(n \log n)\) | 大多数算法(各类算法都适用) |
\(n \leq 10^6\) | \(O(n)\) | 线性 DP、滑动窗口 |
\(n \leq 10^9\) | \(O(\sqrt{n})\) | 判断质数 |
\(n \leq 10^{18}\) | \(O(\log n)\) 或 \(O(1)\) | 二分、快速幂、数学公式 |