在O(nk)时间复杂度

时间:2015-10-15 01:42:44

标签: algorithm sorting data-structures merge heap

最近在接受采访时我被问到这个问题:

  

将每个具有n个元素的k个排序数组合并到一个大小为n k的单个数组中,时间复杂度最小。*

我使用大小为k的minheap给出了一个解决方案,以找到k列表中最小元素的最小值。

这样,时间复杂度将降至-O(nklogk)。

但他并不相信。他想要一个时间复杂度为O(nk)的解决方案。

我在互联网上搜索过,但我无法找到解决方案。

2 个答案:

答案 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)