不同数据范围下,代码的时间复杂度和算法该如何选择:
-
n≤30=>O(kn),dfs + 剪枝,状态压缩 dp
-
n≤102=>O(n3),floyd,dp
-
n≤103=>O(n2),O(n2logn),dp,二分
-
n≤104=>O(n∗√n),块状链表
-
n≤105=>O(nlogn) => 各种 sort,线段树、树状数组、set/map、heap、dijkstra + heap、spfa、求凸包、求半平面交、二分。
-
n≤106=>O(n),以及常数较小的
O(nlogn) 算法 =>
- hash、双指针扫描、kmp、AC自动机,常数比较小的
O(nlogn) 的做法:sort、树状数组、heap、dijkstra、spfa。
-
n≤107=>O(n),双指针扫描、kmp、AC 自动机、线性筛素数。
-
n≤109=>O(√n),判断质数
-
n≤1018=>O(logn),最大公约数
Q:为什么 100w 次的运算给出的 4+ m 内存够用?
A :假设有 100w 个 int 类型变量(4 字节),那么 1000000 × 4 = 4000000 字节(byte),等于 4000000 / 1024 / 1024 = 4 兆 (Mb)。