Algorithm 理解K路合并算法有困难(给出反例)

Algorithm 理解K路合并算法有困难(给出反例),algorithm,heap,Algorithm,Heap,在K-waymerge-sort中,使用堆的解决方案:本质上维护一个堆并不断从该堆中提取max。我有一个反例来解释为什么这不起作用 5 -> 1 -> 0 4 -> 2 -> 1 3 -> 2 -> 0 假设我们初始化堆。它包含{5,4,3} 我们运行extract max,得到5,并将其添加到新列表中(表示最终解决方案)。我们的堆现在看起来像{4,3}。然后,我们用从中提取max元素的列表头重新填充堆 这意味着我们得到如下结果:{4,3,1} 这对我来说毫

在K-waymerge-sort中,使用堆的解决方案:本质上维护一个堆并不断从该堆中提取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)
方法对我来说没有多大意义


我希望有人能解释一下这个算法是如何工作的,因为我被困在这里了。

最大堆总是包含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}

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

堆不需要顶置K个元素。它只需要包含最大的元素。啊,我明白了。我们如何确保(或者更确切地说证明)它始终包含最大的元素?这种方法对我来说相当不直观。实际上,请参见答案中的注释。它详细说明了堆中元素的结构。/它总是包含每个源中最大的元素,所以它总是包含最大的元素。是的-这很有意义。堆中的元素有一些结构。太酷了。(如果只是随机的,那就不令人满意了)
max堆总是包含k个列表(或数组)的max元素。对于您的“计数器”示例
不,它没有。如果是这样,它将包含{4,3,2}。2不是任何列表的最大值,正如从5-->1-->中删除5时所解释的,0:1现在是列表的最大值。哦,我明白了。现在我觉得这很有道理。