微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以使用普通的最小堆方法来解决“合并 k 排序数组”吗

如何解决我可以使用普通的最小堆方法来解决“合并 k 排序数组”吗

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

解决方法

当然可以,但这很慢。您正在丢弃已经进入输入数组的工作(它们已经排序),并且基本上从所有元素的未排序集合中生成排序数组。具体来说,如果所有输入数组的平均长度为 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),一种改进。

,

但我的问题是,由于 min heaps 将元素存储在 sorted 订购所以我们可以简单地使用最小堆的推送功能 来自 k 个数组的元素,然后在最后打印最小堆??

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

image

,

我认为这个算法就是你要找的 算法:

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

所需时间:O(n * k * log k),在最小堆中插入和删除需要 log k 时间。所以总时间复杂度是 O( n * k * log k)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。