下面的表格显示了不同复杂度算法条件下,在几秒钟内它们可以达到的极限,n是输入量大小。我已经为每个复杂的类型增加了一些算法和数据结构的例子。
n最大值 |
复杂度 |
算法 |
数据结构 |
1,000,000,000 and higher |
log n, sqrt n |
对分查找,三元查找, 快速指数,欧几里得算法 |
|
10,000,000 |
n, n log log n, n log* n |
集合相交, Eratosthenes筛选法,基数排序, KMP算法,拓扑排序,欧拉路径, 强连通分量, 2sat图 |
不相交的集, tries树, 哈希映射, 滚动散列双端队列 |
1,000,000 |
n log n |
排序, 分治法, 扫描线算法, Kruskal算法, Dijkstra算法 |
段树, 范围树, 堆, 二叉排序树, 树状数组, 后缀数组 |
100,000 |
n log2 n |
分治法 |
2d范围树 |
50,000 |
n1.585, n sqrt n |
Karatsuba乘法算法, 平方根技巧 |
两层树 |
1000 - 10,000 |
n2 |
最大空矩形, Dijkstra算法, 普里姆算法 (密集图) |
|
300-500 |
n3 |
所有对最短路径, 最大和子阵,原生矩阵乘法, 矩阵链乘积, 高斯消元法, 网络流 |
|
30-50 |
n4, n5, n6 |
|
|
25 - 40 |
3n/2, 2n/2 |
中途相遇 |
哈希表 (交叉集) |
15 - 24 |
2n |
子集枚举, 暴力破解, 动态规划与指数状态 |
|
15 - 20 |
n2 2n |
动态规划与指数状态 |
位集合, 哈希映射 |
13-17 |
3n |
动态规划与指数状态 |
哈希映射 (保存状态) |
11 |
n! |
暴力破解,回溯法, next_permutation全排列 |
|
8 |
nn |
暴力破解, 笛卡尔积 |
|
这些数字不是非常精确,它们假设了内存操作以及一些变化的常数因子,但对于找到与你的问题和数据量大小相适应的解决方案研究方面,它们确实给出了一个很好的起点。 |