【问题标题】:Explanation of external quicksort algorithm外部快速排序算法说明
【发布时间】:2019-09-13 16:35:32
【问题描述】:

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

定义:将 M/2 的第一个和最后一个元素读入缓冲区(缓冲区的作用类似于快速排序中的枢轴),并对它们进行排序。从头或尾读取下一个元素以平衡书写。如果下一个元素小于缓冲区的最小值,则将其写入开头的可用空间。如果大于最大,就写到最后。否则写入缓冲区的最大或最小,并将下一个元素放入缓冲区。保持写入最大的下键和最小的上键,以避免使用按顺序排列的中间元素。完成后,写入缓冲区。递归地对较小的分区进行排序,并循环对剩余的分区进行排序。

我理解有问题:

  • M 是指主存的大小吗?我在某些驱动器上还有剩余的 N-M 元素?

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

  • Read the next element from the beginning or end to balance writing.平衡写作是什么意思?应该从缓冲区(内存)还是从驱动器中读取下一个元素?

  • Otherwise write the greatest or least of the buffer, and put the next element in the buffer - 如果我将下一个元素放入缓冲区(已排序),我需要再次对缓冲区进行排序吗?

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

【问题讨论】:

    标签: algorithm sorting quicksort external-sorting


    【解决方案1】:

    注意 - 我不知道有任何库使用快速排序进行外部排序,所以这主要是一种教育练习。

    维基文章提到了磁带,但这是错误的。不可能在合理的时间内从磁带上数据的两端读取数据,并且不可能在不破坏数据之后的现有数据的情况下覆盖磁带上的数据。因此,请将此视为对硬盘驱动器或 SSD 类型设备上的文件进行的外部排序,具有随机访问和就地覆盖数据的能力。

    M是指主存的大小吗?

    根据上下文,工作内存区域的大小为M·sizeof(element)。需要有额外的可用内存才能在不覆盖缓冲区的情况下读取元素。

    某些驱动器上的“N-M”元素?

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

    缓冲区的作用类似于快速排序中的枢轴?

    缓冲区被排序为一次运行,缓冲区中的最小值和最大值加上刚刚读取的一个元素作为一个枢轴值范围,以确定要写入哪个元素。

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

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

    此时算法存在问题。由于每个元素被读取,需要合并到 M 个元素的缓冲区中,非常慢。解决此问题的一种方法是使用最小-最大堆作为缓冲区。

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

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

    所描述的算法很慢,因为它一次读取和写入一个元素。保留部分内存来分组缓冲读写会快得多。

    【讨论】:

    • 很好的解释。如果我们说驱动器的读写是 O(1) 操作,那么这个算法满足(平均)递归关系T(N)=2*T((N-M)/2) + O(N logM),对于相对较小的M(被认为是常数)给出O(N logN) - 相同的复杂性作为标准快速排序。
    猜你喜欢
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2012-06-07
    • 2016-11-24
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多