每个开发者都必须知道的14个数字

Jeff Dean , 一位著名的 Google 工程师, 推出了一个 每个人都必须知道的数字 的潜在数字列表。这个列表对设计大型基础架构的系统是一个巨大的资源。

算法及其复杂性总是会在计算机系统的关键部分出现,但我发现很少有工程师对一个O(n!)级算法相较一个 O(n5) 算法会怎样有很好的理解。

在编码比赛世界里,竞争选手一直在考虑这些优化权衡。毫不奇怪,有一组每个算法设计者都应该知道的数字。

下面的表格显示了不同复杂度算法条件下,在几秒钟内它们可以达到的极限,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

相关推荐