外部排序:多路合并

时间:2011-09-30 11:53:40

标签: algorithm

在多路合并中任务是找到k个元素中的最小元素

解决方案:优先级队列

想法:从第一个k运行中获取最小元素,将它们存储在堆树中的主存储器中。

然后重复输出堆中的最小元素。最小的元素将替换为它来自的运行中的下一个元素。

完成第一组运行后,对下一组运行执行相同操作。

假设我的主要内存大小(M)小于k,我们如何对元素进行排序,换句话说,如果内存大小M小于K

,多路合并算法合并的工作方式

例如,如果我的M = 3且我有以下

Tape1:8 9 10 Tape2:11 12 13 Tape3:14 15 16 Tape4:4 5 6

我的问题muliway merge是如何工作的,因为我们将读取8,11,14并构建优先级队列,我们​​将8放置到输出磁带然后转发Tape1,当读取Tape4时我没有得到它以及我们将如何与已经比较写到输出磁带?

谢谢!

1 个答案:

答案 0 :(得分:0)

它无效。您必须为可用内存选择足够小的k

在这种情况下,您可以对前3个磁带进行3向合并,然后在其结果与剩余磁带之间进行双向合并。或者您可以进行3次双向合并(两对磁带,然后合并结果),这更容易实现,但可以进行更多的磁带访问。

理论上你可以放弃优先级队列。然后你不需要在内存中存储k元素,但是你经常需要查看所有k磁带上的下一个元素才能找到最小的元素。