双向多路合并排序

时间:2012-04-08 04:29:40

标签: database algorithm memory

这是“数据库系统完整的书,第2版”一书中的问题 - 第15章:基于排序的双遍算法。 “有时,如果我们将最后一个子列表留在内存中,可以保存一些磁盘I / O.甚至可以使用少于块的子列表来利用这种效果。有多少磁盘I / O' s可以这样保存吗?“

我发现你将原始关系划分为子列表并在第一遍中对它们进行排序,并将最后一个列表保留在内存中,这将占用少于M-1块。那你如何进行排序呢?

1 个答案:

答案 0 :(得分:1)

这只是猜测,但我怀疑答案可以描述如下。标准的“一次一级”合并排序如下所示:

1 1 1 1 1 1 1 1
--- --- --- ---  -- pass 1
 2   2   2   2
 -----   -----   -- pass 2
   4       4
   ---------     -- pass 3
       8

请注意,我们会在进入下一级别之前执行输入数据的完整传递。

另一种选择是“一次子树下”合并排序,如下所示:

1 1 1 1 1 1 1 1
--- | | | | | |
 2  --- | | | |
 |   2  | | | |
 -----  | | | |
   4    --- | |
   |     2  ---
   |     |   2
   |     -----
   |       4
   ---------
       8

这里,我们将每个子树与其邻居构建后的高度相同。我们做了相同数量的工作,但地点得到了改善。

干杯。