如何降低使用堆合并多个数组的复杂性?

时间:2014-03-14 18:10:05

标签: arrays merge heap time-complexity merging-data

我对此问题中提出的想法进行了编码:merging sorted arrays,如下所示:Big-O complexity calculation for a merge and sort function

可以看出,这种方法的复杂性超出了预期的范围。有没有更好的方法(除了使用LINQ)?如果有的话,这种方法的根本缺陷是什么?

1 个答案:

答案 0 :(得分:0)

  

我们可以使用Min Heap在O(nk * Logk)时间内合并数组。

n =数组的最大大小,k =数组的数量。

  1. 创建一个大小为n*k的输出数组(您也可以只打印它们)。
  2. 创建一个大小为k的最小堆,并将所有数组中的第一个元素插入到堆
  3. 重复以下步骤n*k次  a)从堆中获取最小元素(最小值始终为root)并将其存储在输出数组中(或打印它)  b)将堆根替换为从中提取元素的数组中的下一个元素。如果数组没有任何其他元素,则用无限替换root。替换root后,堆化树。
  4. 时间复杂度:主要步骤为3rd步骤,循环运行n*k次。在循环的每次迭代中,我们调用heapify,花费O(Logk)时间 因此,时间复杂度为O(nk*Logk)

    EDIT1 : Heapify确保您始终拥有 min-heap ,如果最小值小于父节点,它会将最少的子节点与父节点交换。

    这可确保INFINITY元素保留在底部,并且所有k数组中的最小元素保留在堆的顶部(根)。