Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 外部排序阶段的组合复杂性_Algorithm_Sorting_Complexity Theory - Fatal编程技术网

Algorithm 外部排序阶段的组合复杂性

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

外部排序复杂性已经得到了很好的描述。在第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 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访问方面可以获得相同的运行时间,但您的程序可能永远不会完成(如果完成了,它将非常慢)