Java 使用二进制堆进行多数组合并

Java 使用二进制堆进行多数组合并,java,algorithm,binary-tree,complexity-theory,Java,Algorithm,Binary Tree,Complexity Theory,给定k个整数排序数组,每个数组包含未知的正元素数(每个数组中的元素数不一定相同),其中所有k个数组中的元素总数为n,给出将k个数组合并为包含所有n个元素的单个排序数组的算法。 算法的最坏情况时间复杂度应为O(n∙日志k)。命名k排序列表1,…,k 让A作为组合排序数组的名称 对于每个列表,i,从i中弹出v并将(i,v)推到最小堆中。现在,堆将包含每个列表中最小条目的值和列表id对 当堆不为空时,从堆中弹出(i,v),并将v附加到A。 从列表中弹出下一项i(如果它不是空的),并将其放入堆中 堆中有

给定k个整数排序数组,每个数组包含未知的正元素数(每个数组中的元素数不一定相同),其中所有k个数组中的元素总数为n,给出将k个数组合并为包含所有n个元素的单个排序数组的算法。
算法的最坏情况时间复杂度应为O(n∙日志k)。

命名k排序列表1,…,k

A
作为组合排序数组的名称

对于每个列表,i,从
i
中弹出
v
并将
(i,v)
推到最小堆中。现在,堆将包含每个列表中最小条目的值和列表id对

当堆不为空时,从堆中弹出
(i,v)
,并将
v
附加到
A
。 从列表中弹出下一项
i
(如果它不是空的),并将其放入堆中

堆中有
n
添加和删除。 堆在每个时间步最多包含
k
个元素。
因此,运行时是
O(nlogk)

可能只是不变的,堆包含来自尚未清空的数组的最小元素。当您试图从列表i中弹出一个项目时,如果该列表为空,您将继续从堆中弹出元素。

给定k个家庭作业任务,每个任务的难度未知(不一定不同),其中所有k个家庭作业任务的总难度为n,您自己做家庭作业通常是有益的,作业标签是由另一个用户添加的(可能是推测)。哈哈,没错。但任何问题都可以这样说。最近也有人问过类似的问题:-参见答案there@dsg我知道,这就是为什么我写了《相似》:-)伟大的解决方案!但是每一步的heapify操作呢?我认为时间复杂度将是O(nk logk)