外部快速排序算法的说明

时间:2019-04-24 11:29:32

标签: algorithm sorting quicksort external-sorting

我正在尝试了解quicksort的外部版本(当数据无法放入主存储器中时)。我在外部快速排序过程的following link中找到了Wiki和类似的解释:

  

定义:将M / 2的第一个和最后一个元素读入缓冲区(该缓冲区的作用类似于quicksort中的数据透视),并对它们进行排序。从头到尾阅读下一个元素以平衡写作。如果下一个元素小于缓冲区中的最小元素,则在开始时将其写入可用空间。如果大于最大值,则将其写入末尾。否则,写入最大或最小的缓冲区,然后将下一个元素放入缓冲区。保持最大,最小和最小上部键被写入,以免重新排序中间的元素。完成后,写入缓冲区。递归排序较小的分区,然后循环以排序其余分区。

我很难理解它:

  • M是指主内存的大小吗?而且我还剩下N-M个元素在某个驱动器上?

  • The buffer acts like the pivot in quicksort-这是否意味着我需要将驱动器中剩余的N-M个元素划分为两个部分ab,其中{{ 1}}低于缓冲区中的所有元素,而a中的元素大于或等于缓冲区中的最大元素?

  • b 平衡写作是什么意思?应该从缓冲区(内存)还是从驱动器读取下一个元素?

  • Read the next element from the beginning or end to balance writing.-如果我将下一个元素放入缓冲区(已经排序),我需要再次对缓冲区进行排序吗?

一些示例它如何工作或更好的解释将非常有用。

1 个答案:

答案 0 :(得分:1)

注意-我不知道任何使用quicksort进行外部排序的图书馆,因此这主要是一项教育性练习。

Wiki文章提到磁带,但这是错误的。无法在合理的时间内从磁带的两个“末端”读取数据,并且在不破坏紧随数据之后的现有数据的情况下,也无法覆盖磁带上的数据。因此,应将其视为对具有随机访问权限并具有就地覆盖数据功能的硬盘驱动器或SSD类型设备上的文件的外部排序。

  

M是指主内存的大小吗?

根据上下文,工作存储区的大小为M·sizeof(element)。需要额外的可用内存来读取元素,而不会覆盖缓冲区。

  

某个驱动器上的'N-M'个元素?

是的,由于内存只能容纳M个元素,因此N-M个元素保留在外部设备上。

  

缓冲区就像快速排序中的枢轴一样?

将缓冲区分类为一次运行,缓冲区中的最小和最大值以及刚刚读取的一个元素将作为一系列枢轴值,以确定要写入哪个元素。

  

从头到尾阅读下一个元素以平衡写作。`平衡写作是什么意思?应该从缓冲区(内存)还是从驱动器读取下一个元素?

在文件的开头或结尾有写M / 2元素的空间。可以从任一端读取第一个读取的元素。如果从开头+ M / 2读取元素。则缓冲区中最小的元素将在开始时被写入,仍然为要写入的元素保留M / 2空间。如果从末尾读取一个元素-M / 2,则将最大的元素写入文件中的最后一个元素,在末尾保留M / 2的空间以便写入元素。

此时的算法问题。读取每个元素时,需要将其合并到M个元素的缓冲区中,这非常慢。解决此问题的一种方法是使用min-max堆作为缓冲区。

https://en.wikipedia.org/wiki/Min-max_heap

最终,文件从两端的中间M元素开始写入,然后写入M元素缓冲区。此时,文件开头的所有元素都小于或等于文件结尾所有的元素,并且该文件可以视为2个分区。然后对每个分区进行分区,从而产生4个分区,然后是8个分区,依此类推,直到最终一个分区适合内存并使用正常的内存排序。

所描述的算法很慢,因为它一次只能读写一个元素。保留部分内存来分组缓冲读写操作会更快。

相关问题