是否有时间将已排序的列表合并到单个排序列表中?

时间:2015-12-05 16:22:55

标签: algorithm time-complexity

给定logN个排序列表,每个列表的大小为N*logN。将它们合并到单个排序列表所需的总时间是多少?

A) O(NlogN)
B) O(N)
C) O(NloglogN)
D) O(Nlog(N/logN))

我尝试通过取N = 4来解决它。但没有选择令人满意。

2 个答案:

答案 0 :(得分:5)

我相信答案有点偏离,我知道这样做的一种方法如下:

合并K个已排序的大小为M的列表使用Min Heap:

  1. 创建排序列表中前k个元素的MinHeap - 可以在O(K)时间内完成。

  2. 虽然MinHeap不为空:

    2.1。取出最小的项目 - O(log(K))并将其放入已排序的输出中。

    2.2。从列表中的下一个元素中获取2.1中的项目并将其添加到MinHeap - O(log(K))

  3. 时间复杂度: O(K) + O(K * M * log(K)) = O(K * M * log(K))

    在我们的案例中:

    O(K*M*log(K)) = O(log(N) * N * log(N) * log(log(N)) = O(N * log^2(N) * log(log(N))

    修改 正如这里所建议的,另一种方法是成对合并所有列表:

    通过合并对合并K个已排序的大小为M的列表:

    1. 将所有列表放在一个列表中。
    2. while | L |> 1:

      2.1。将L分成对(a,b)并将a和b合并为c - 用于大小为M的列表,这将是O(M)合并。

      2.2。将所有合并列表(c)放入单个列表L(替换之前的L)。

    3. L中唯一的列表就是结果。

    4. 时间复杂性分析: 在每次迭代中,我们遍历所有元素 - O(MK)和合并,log(K)迭代将导致O(log(K)* MK)= O(N * log ^ 2(N)* log(log(N) ))

答案 1 :(得分:1)

这些命题都不可能,只是因为最终列表的大小为N.Log²(N)