【问题标题】:merging sorted arrays [duplicate]合并排序数组[重复]
【发布时间】:2011-03-21 06:47:37
【问题描述】:

可能的重复:
Merging two sorted lists
Algorithm for N-way merge

给定 k 个长度为 n 的排序数组,构造一个合并排序数组。关注运行时间和空间复杂度。

来源:亚马逊面试问题。
有什么想法吗?谢谢

【问题讨论】:

  • @Noel M:不是重复的,这个是关于合并(可能)两个以上的排序列表。
  • 是的,你是对的,对不起。我还在半睡中

标签: algorithm


【解决方案1】:

从每个数组的第一个元素创建一个堆。从堆中弹出头元素,将其插入结果数组,然后从堆头所在的数组中取出下一个元素,并将其插入堆中。重复直到你用完所有的数组。

【讨论】:

  • 这不是非常低效吗,因为 OP 中描述的条件描述了一个合并排序,它是完成方式的一部分?想想看。你有一些排序数组,你要合并到一个排序数组中。您已经具备合并排序的条件。我不是要在你的想法中挑漏洞,只是我只是在深入挖掘排序算法并尽可能多地学习。
  • @Michael 这基本上是一种合并排序。我刚刚将它扩展到合并两个以上的排序列表。堆的要点是它可以在次线性时间 O(log(n)) 内找到更新的候选集的最小值。至少是这样的想法。
  • @Michael McTiernan:不,你误会了。 Null Set 并不建议将所有输入数组元素转储到堆上——这确实是非常低效的。 Null Set 提出的是构建一个仅包含 k 元素的堆:它包含每个排序数组中的第一个(最小)元素。每个数组中只有一个元素。当您从堆中删除最小元素(并将其发送到输出)时,您将同一数组中的下一个元素添加到堆并重建堆。这样堆的大小总是只有k。
  • 这基本上是教科书合并两个排序数组的方法,但通过使用堆从k元素中选择最小值,从两个数组扩展到k数组.在这种方法中,排序部分完成的事实被该算法大量使用。
  • 请注意,此解决方案是最佳的。假设您可以做得比 O(nlogk(k)) 更好 - 在这种情况下,您可以将每个数组拆分为 n 个大小为 1 的已排序子数组,然后对其进行排序,其复杂性比 O( nlog(n))。由于排序已被证明是 omega(n*logn),因此您会遇到矛盾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2015-12-09
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多