如何在2n RAM中对n ^ 2个元素进行排序

时间:2010-11-22 11:25:29

标签: algorithm

有人可以告诉我如何使用2n RAM来排序n ^ 2个元素。 一种可能的方法是分成n个大小为n的数组。然后在n个元素中进行合并排序,最后在n个数组上保持n个堆的大小。但是,这意味着每次放置一个元素时,我都会进行磁盘读取,每次完成n个元素时,我都会进行磁盘写入。 有更好的建议吗? 感谢。

2 个答案:

答案 0 :(得分:2)

如果您碰巧有一个缓存无关的优先级队列实现,您可以使用它来实现磁盘和内存层次结构中每个级别的内存传输的最佳运行时间(请参阅http://courses.csail.mit.edu/6.897/spring05/lec/lec23.pdf

否则,如果您只想从头开始编写简单代码,那么基于磁盘的mergesort实现应该可以正常工作。基本上,您可以通过首先递归地排序“左”和“右”两半来对数组的范围进行排序,然后使用2n内存将它们合并以缓冲来自磁盘的递归排序的子数组。对于一个简单的实现,这不适用,所以你必须在磁盘上保留两个阵列副本并来回穿梭。

答案 1 :(得分:0)

这是不可能的。单独的元素你需要n ^ 2个内存。

如果你不计算这种明显的内存消耗,我推荐一种就地排序算法,比如heapsort。这需要额外的O(1)空间。

如果您正在寻找一种外部排序算法,其中外部存储器不计数但只计算内部存储器,我建议使用自下而上的mergesort。您可以根据需要使用此内存;消耗大约2n内存,总是从每个部分排序的集合中读取n / 2个元素,并将它们合并到另一个n个元素的数组中;然后将结果写回磁盘(最好写入单独的文件)。