给定k个已排序的整数数组,每个数组包含一个未知正元素数量(不一定是每个数组中的元素数量相同),其中所有k个数组中的元素总数为n,编写一个算法将这k个数组合并为一个包含所有n个元素的已排序数组。
该算法的最坏时间复杂度应为O(n∙log k)。
给定k个已排序的整数数组,每个数组包含一个未知正元素数量(不一定是每个数组中的元素数量相同),其中所有k个数组中的元素总数为n,编写一个算法将这k个数组合并为一个包含所有n个元素的已排序数组。
该算法的最坏时间复杂度应为O(n∙log k)。
将k个排序列表命名为1到k。
令A
为合并后的排序数组名字。
对于每个列表,弹出中的项v
并将(i, v)
压入最小堆中。现在堆包含每个列表中最小条目的值和列表ID的对。
只要堆不为空,就从堆中弹出(i, v)
并将v
附加到A
中。
弹出列表中的下一项(如果不为空),并将其放入堆中。
从堆中添加和删除元素共进行了n
次操作。
堆在每个时间步骤最多包含k
个元素。
因此,运行时间为O(n log k)
。
也许只是因为不变量是堆包含尚未清空的数组中最小的元素。当您尝试从列表i中弹出一个项目时,如果此列表为空,则继续从堆中弹出元素。