【发布时间】:2012-06-14 03:21:28
【问题描述】:
k-way merge 是将 k 个排序数组作为输入的算法,每个数组的大小为 n。它输出所有元素的单个排序数组。
它使用合并排序算法的核心“合并”例程将数组 1 合并到数组 2,然后将数组 3 合并到这个合并的数组,以此类推,直到所有 k 个数组都合并。
我原以为这个算法是 O(kn),因为该算法遍历了每个 k 个数组(每个数组的长度为 n)一次。为什么是 O(nk^2)?
【问题讨论】:
-
您可以通过使用堆或选择树在每个阶段从 k 个可能的选择中选择下一个元素来获得 O(n k log k)。例如。 Knuth Volume II 排序和搜索第 5.4.1 节
-
算法选择数组对,所以你有 comb(k 2) = k * (k-1) /2。由于每个数组的大小为 n 并且合并需要 O(n) 你得到 O(nk^2)
-
你可以使用队列,时间为 O(n log k) 其中 n 是整数个数,k 是排序数组的个数
-
@Dejel 遍历所有元素将花费 O(nk)。使用堆,我们可以得到 O(nklogk)。能否详细说明如何实现O(nlogk)?
标签: algorithm