最近在接受采访时我被问到这个问题:
将每个具有n个元素的k个排序数组合并到一个大小为n k的单个数组中,时间复杂度最小。*
我使用大小为k的minheap给出了一个解决方案,以找到k列表中最小元素的最小值。
这样,时间复杂度将降至-O(nklogk)。
但他并不相信。他想要一个时间复杂度为O(nk)的解决方案。
我在互联网上搜索过,但我无法找到解决方案。
答案 0 :(得分:4)
他错了,你是对的。或者这可能是一个棘手的问题。
如果存在这样的解决方案,你可以在O(K)中对任何大小为K的数组进行排序,这被证明是不可能的。
以下是:你只需将大小为K的数组划分为K个单例数组,然后应用你的魔法函数。
单例数组当然都是单独排序的。复杂性:O(K)用于构建单例数组,O(K * 1)用于合并(根据我们反驳的假设)。
答案 1 :(得分:2)
虽然你说得对,任何比较排序的下限是n * log(n)[其中n是数组的大小],但是排序算法可以花费更少的时间。
由于您有k个排序列表,因此很容易找到最后要获取的列表的最小值(称为m)和最大值(称为M)值。现在你知道你需要排序的每个元素都在m和M之间。所以你可以使用Counting Sort,它需要线性时间。 [https://en.wikipedia.org/wiki/Counting_sort]
因此,需要O(k)来找到m和M然后O(n * k)来对数组进行排序。因此整个算法将采用O(nk)