在 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)
最近在一次采访中有人问我这个问题:
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)