【问题标题】:Can i use the normal min heap method for solving "Merge k sorted array"我可以使用正常的最小堆方法来解决“合并 k 排序数组”吗
【发布时间】:2021-07-03 18:01:21
【问题描述】:

我们得到了 k 个排序数组。假设k = 3 a1={1,4,7} a2={3,5} a3={2,6,7} 现在我们应该按排序顺序合并这 3 个数组。因此输出将是 {1,2,3,4,5,6,7,7}。 现在在我正在关注的教程中,他们维护了一个索引并使用对来使用最小堆解决这个问题。 但我的问题是,既然 min heaps 按排序顺序存储元素,那么我们可以简单地使用 min heap 的 push 功能来处理 k 数组中的所有元素,然后最后打印 min heap 吗?而不是保持索引和配对?在 C++ 中?

【问题讨论】:

    标签: c++ arrays data-structures min-heap


    【解决方案1】:

    当然可以,但这很慢。您正在丢弃已经进入输入数组的工作(它们已经排序),并且基本上从所有元素的未排序集合中制作排序数组。具体来说,如果所有输入数组的平均长度为n,那么您在堆中执行k*n 插入,然后提取最少k*n 次。堆操作具有复杂性O(log(k*n))。所以整个算法需要O(k*n*log(k*n)) 时间,您可能会认为这是对大小为k*n 的未排序数组进行排序所需的时间。当然有更好的方法,因为你知道输入数组是排序的。

    我认为给定的解决方案是将k“迭代器”构造到数组中,将它们放入按每个迭代器的值排序的堆中,然后反复删除最小迭代器,消耗它的值,递增它,然后将其放回堆中。关键是堆(这是所有工作发生的地方)更小:它只包含k 元素而不是k*n。这使得堆上的每个操作都更快:现在这个算法中的堆操作是O(log k)。整体算法现在是O(k*n*log k),一个改进。

    【讨论】:

    • 非常感谢您的澄清。
    【解决方案2】:

    我认为这个算法是你正在寻找的 算法:

    创建一个最小堆并插入所有 k 个数组的第一个元素。运行一个 循环直到 MinHeap 的大小大于零。移除顶部 MinHeap 的元素并打印该元素。现在插入下一个 删除元素所属的同一数组中的元素。如果 数组没有更多元素,然后将 root 替换为 无限。替换根后,堆树。

    大约需要的时间:O(n * k * log k),Min Heap 中的插入和删除需要 log k 时间。所以总时间复杂度是 O(n * k * log k)

    【讨论】:

    【解决方案3】:

    但我的问题是,由于 min heaps 将元素存储在 sorted order 所以我们可以简单地使用 min heap 的 push 功能 for all k 数组中的元素,然后在最后打印最小堆??

    最小堆的主要递归规则:左右孩子应该小于父母。这并不意味着左孩子应该小于树右侧的父母。附图显示最小堆。但是这个最小堆不是最终排序的数组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2011-03-07
      相关资源
      最近更新 更多