使用堆进行大磁盘排序

时间:2019-06-01 20:06:43

标签: python algorithm sorting heap external-sorting

在官方Python文档here上,提到:

  

在大磁盘类型中,堆也非常有用。你们所有人   知道大分类意味着产生“游程”(已预先分类)   序列,其大小通常与CPU内存量有关),   然后是这些运行的合并通行证,通常合并   组织得非常巧妙。
  最初的   排序会产生最长的运行时间。比赛是个好方法   实现这一目标。如果使用所有可用的内存来保存   比赛中,您替换并渗入恰好适合   当前运行,您将生成两倍于   内存用于随机输入,更好地用于模糊排序的输入。

     

此外,如果您在磁盘上输出第0个项目并获得输入   可能不适合当前比赛(因为“胜出”   最后的输出值),它不能容纳在堆中,因此   堆减少。释放的内存可以被巧妙地重用   立即逐步建立第二个堆,该堆在   第一堆融化的速率完全相同。
  当第一堆   完全消失,您切换堆并开始新的运行。聪明和   很有效!

我知道一种叫做External sorting的算法,在该算法中,我们:

  1. 将输入分成较小的块。
  2. 分别对所有块进行排序,并将它们一块一张地写回到磁盘上。
  3. 创建一个堆,并在所有排序的块之间进行k路合并。

我完全理解Wikipedia上所述的外部排序,但是当他们说:

  

如果使用所有可用于举办比赛的内存替换   并渗透恰好适合当前运行的物料,您将产生   运行是随机输入的内存大小的两倍,并且   更好地用于模糊排序的输入。

和:

  

此外,如果您在磁盘上输出第0个项目并获得输入   可能不适合当前比赛(因为“胜出”   最后的输出值),它不能容纳在堆中,因此   堆减少。

这是什么 堆熔化

1 个答案:

答案 0 :(得分:0)

堆熔化不是问题。这只是作者用来使堆变小以拉出最小项目的词。

他正在谈论的想法是对外部排序中“将输入分为多个块并对每个块进行排序”部分的巧妙替代。它会产生更大的排序块。

想法是,您首先将可以读取的最大块读入内存,然后将其排列到堆中,然后在读取新元素时开始从堆中写出最小的元素。

当您读入一个小于已写出的元素的元素时,它就不能进入当前块(这会破坏排序),因此您要记住下一个块。不小于您写入的最后一个元素的元素可以插入堆中。他们会将其放入当前块中,使当前块变大。

最终,您的堆将为空。到那时,您已经完成了当前块的工作-堆放您记住的所有元素,然后开始写出下一个块。