为什么称为堆排序最适合外部排序?

问题描述 投票:1回答:3

在研究排序算法时,它被称为堆排序用于外部排序。在处理外部存储时,我无法弄清楚它在排序技术方面有何不同?或者什么是堆排序唯一被认为对外部排序有用的东西?

有人可以解释一下吗?

sorting heapsort binary-heap external-sorting
3个回答
1
投票

排序的外部部分是k-way合并排序。外部媒体上的数据块或文件(例如硬盘驱动器)一次重复合并“k”,直到产生单个排序文件。

min-heap是实现k-way合并的内部部分的常用方法。

创建数据块或文件的初始传递可以是任何内部排序,如果需要稳定性,则可以稳定。在排序记录的情况下,合并排序可用于对指向记录的指针数组进行排序,这减少了空间要求,因为只有指针数组需要第二个数组,而不是记录的第二个数组。应该注意的是,对指针进行排序可能比排序记录慢,因为通过指针排序最终随机访问记录以进行比较,这不是缓存友好的。

大文本文件的Gnu排序是外部排序的一个示例。它一次读取一行“块”,创建指向行的指针,并在指针上使用合并排序,然后为每个排序的块创建一个临时文件。然后它在临时文件上执行16路(默认值为16)合并,直到它到达最终合并步骤,最终合并将进入指定的输出文件。

链接到源。这是一个很大的计划,部分原因是因为它有很多选择。

http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/sort.c


1
投票

我们来自the Linux kernel code的一个例子:

此函数在给定数组上执行堆操作。排序时间是平均和最差情况下的O(n log n)。虽然qsort的平均速度提高了大约20%,但它遭受了可利用的O(n * n)最坏情况行为和额外的内存需求,这使得它不太适合内核使用。

来自Wikipedia

Heapsort还与合并排序竞争,合并排序具有相同的时间范围。合并排序需要Ω(n)辅助空间,但是heapsort只需要一个恒定的数量。对于具有小型或慢速数据高速缓存的计算机,Heapsort通常在实践中运行得更快,并且不需要那么多的外部存储器。


0
投票

堆排序最适合在外部排序中创建初始运行,

但是使用堆来创建初始运行会导致预期的初始运行长度是堆大小的两倍(对于密钥的统一分配),因此,初始运行的数量是对每批记录进行排序并编写它的任何方法的一半作为运行(使用相同数量的RAM)。 通过双向合并,初始运行的一半可以节省整个传递。使用高级合并方案,高度(运行次数合并为一次),甚至通过次数(比率数据/ RAM大小),这都会产生影响。

© www.soinside.com 2019 - 2024. All rights reserved.