在 O(nk) 时间复杂度内合并大小为 n 的 k 个已排序数组

Merge k sorted arrays of size n in O(nk) time complexity

最近在一次采访中有人问我这个问题:

Merge k sorted arrays each with n elements into a single array of size nk in minimum time complexity.*

我给出了一个解决方案,使用大小为 k 的最小堆来查找 k 列表顶部元素的最小值。

这样时间复杂度就会下降到 - O(nklogk)。

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

我在网上搜索过,但找不到解决办法。

他错了,你是对的。或者这可能是一个棘手的问题。

如果存在这样的解决方案,您可以在 O(K) 中对任何大小为 K 的数组进行排序,这被证明是不可能的。

方法如下:您只需将大小为 K 的数组分成 K 个单例数组,然后应用魔术函数。

单例数组当然都是单独排序的。复杂度:O(K) 用于构建单例数组,O(K*1) 用于合并(根据我们反驳的假设)。

虽然您说的任何比较排序的下限都是 n*log(n) [其中 n 是数组的大小],但有些排序算法可以花费更少的时间。

因为你有 k 个排序列表,所以很容易找到你想要在最后获得的列表的最小值(称为 m)和最大值(称为 M)。现在你知道你需要排序的每个元素都在 m 和 M 之间。所以你可以使用需要线性时间的计数排序。 [https://en.wikipedia.org/wiki/Counting_sort]

因此,找到m和M需要O(k),然后对数组进行排序需要O(n*k)。所以整个算法将花费 O(nk)