Algorithm 外部排序阶段的组合复杂性
外部排序复杂性已经得到了很好的描述。在第2页和第3页,它很好地描述了Algorithm 外部排序阶段的组合复杂性,algorithm,sorting,complexity-theory,Algorithm,Sorting,Complexity Theory,外部排序复杂性已经得到了很好的描述。在第2页和第3页,它很好地描述了phase1和phase2。我理解每个步骤中描述的复杂性。我的问题是在线总结阶段1和阶段2的成本,我们得到了项目的总运行时间 Θ(n log2) (n/m))第4页提到。伪代码之后 据我所知,第1阶段的复杂性是: O(MlogM)对主存缓冲区中的所有记录进行排序。 我们将缓冲区填充N/M次,从而有效地O(N/M*M log M),即O(NlogM) 如何: 阶段1:O(NlogM) 及 第二阶段:Θ(n对数m/n) Θ(n lo
phase1
和phase2
。我理解每个步骤中描述的复杂性。我的问题是在线<代码>总结阶段1和阶段2的成本,我们得到了项目的总运行时间
Θ(n log2)
(n/m))第4页提到。伪代码之后
据我所知,第1阶段的复杂性是:
O(MlogM)对主存缓冲区中的所有记录进行排序。
我们将缓冲区填充N/M次,从而有效地O(N/M*M log M),即O(NlogM)
如何:
阶段1:O(NlogM)
及
第二阶段:Θ(n对数m/n)
Θ(n log2)中的组合结果
(n/m)) 在评估外部算法的性能时,我们通常只计算执行算法所需的磁盘操作数。本文定义了
n=n/B
和m=m/B
阶段1实际上只需要
Θ(n)
磁盘操作,因为我们只读取和写入每个块一次。现在很明显,Θ(n)+(n log n/m)=(n log n/m)
哦,我明白了,只是好奇我们通常只计算磁盘操作的数量
-为什么?@JavaDeveloper:因为与排序中涉及的任何其他操作相比,磁盘操作都非常慢。从硬盘读取单个字节所需的时间与52000000 CPU周期大致相同。甚至从RAM读取也需要大约20000-332000个CPU周期。缓存为王。@JavaDeveloper:外部内存模型允许您根据算法的内存位置来分析算法。它很有用,因为内存层次结构具有一个重要特性,即较小的缓存(L1
,L2
)比较大的缓存、RAM甚至磁盘快得多。因此,在实践中,如果我们将缓存未命中/加载+存储从内存层次结构中的更高级别最小化,我们通常会得到更快的算法,因为它们往往会主导整个运行时。显然,这并不意味着您总是可以得出这样的结论:如果最小化I/O,就可以得到一个快速算法。例如,如果在您引用的外部mergesort算法的第1阶段中使用Bogo sort而不是Merge sort,则在I/O访问方面可以获得相同的运行时间,但您的程序可能永远不会完成(如果完成了,它将非常慢)