无法理解K-way合并算法(给出的计数器示例)

时间:2018-04-01 17:57:20

标签: algorithm heap

在K方式合并排序中,使用堆的解决方案:基本上维护一个堆并不断从该堆中提取max。我有一个反例,说明为什么这不会很好。

5 -> 1 -> 0
4 -> 2 -> 1
3 -> 2 -> 0

假设我们初始化堆。它包含{5,4,3}。

我们运行extract max,我们获得5并将其添加到我们的新列表中(代表最终解决方案)。我们的堆现在看起来像{4,3}。然后我们用我们从中提取max元素的列表头重新填充我们的堆。

这意味着我们会得到这样的结果:{4,3,1}。

这对我没有意义。此堆不再代表前K个元素。 1不应该用来重新填充堆,它应该是2.所以,这个O(nlgk)方法对我没有多大意义。

我希望有人可以了解这个算法是如何运作的,因为我被困在这里。

1 个答案:

答案 0 :(得分:1)

最大堆始终包含k个列表(或数组)的最大元素。对于你的“反击”例子:

5 -> 1 -> 0
4 -> 2 -> 1
3 -> 2 -> 0

堆是{5,4,3}包含这三个列表的最大元素。

现在你从堆中提取5,意味着你也从第一个列表中删除了5:

5-->1-->0: after extract 5, the list now is 1-->0: so 1 now is the top of the list.

然后新堆是{4,3,1},仍然包含列表的最大元素。

让我们继续你的例子:提取5和堆化后的当前堆是:

{4, 3, 1}

从堆中提取4意味着您也从以下位置删除4:

4-->2-->1: remove 4 you have 2-->1. 2 now is the top element of the list.

然后现在有一个新堆

{3, 2, 1}

继续这样做,你得到你想要的东西(降序列表)。