使用二进制堆的多个数组合并

时间:2011-03-26 23:53:25

标签: java algorithm binary-tree complexity-theory

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

2 个答案:

答案 0 :(得分:10)

将k-sorted列表命名为1,...,k。

A成为组合排序数组的名称。

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

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

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

答案 1 :(得分:0)

也许只是不变量是堆包含未被清空的数组中的最小元素。当您尝试从列表i中弹出一个项目时,如果此列表为空,则继续从堆中弹出元素。