当前位置: 首页 > 知识库问答 >
问题:

将k个排序数组合并为一个排序数组[重复]

薛弘阔
2023-03-14

我想写一个时间O(n*lgk)的算法,将k个排序数组合并成一个排序数组,其中n是所有输入数组的元素总数。

你能告诉我怎么做吗?

编辑:我编写了以下算法:

Algorithm(L) // L=[L1, L2, L3, ...., Lk]
  list=LNEW;
  for (i=1; i<=k; i++){
      H[i]=L[i][1];
  }
  BUILD-HEAP(H);
  j=1;
  while (j<n){
         LNEW[j]=H[1];
         yes=0;
         m=1;
         while (m<=k and L[m][j]!=NULL and L[m][j+1]!=NULL and yes!=1){
                if (H[1]==L[m][j]){
                    H[1]=L[m][j+1];
                    yes=1;
                    Heapify(H);
                }
                j=j+1;
  }

你能告诉我这是否正确吗?

共有1个答案

储承
2023-03-14

我们可以维护由k个元素firstFree组成的数组,其中firstFree[i]是第i个数组中第一个未使用的元素。另外,我们可以有一个最多包含k个元素的堆(每个元素是一对(值,包含该值的数组的索引))。最初,我们应该将所有给定数组的第一个元素放入这个堆中。之后,我们应该重复以下过程,直到堆为空:

>

  • 弹出堆的顶部元素。将其添加到输出数组中。

    增加包含此元素的数组的firstFree值。如果没有超过数组的大小,则将下一个元素添加到堆中。

    该算法不进行n次插入和弹出操作,因此其时间复杂度为O(n log k)。

  •  类似资料:
    • 问题内容: 这是在采访中问我的,这是我提供的解决方案: 有没有更有效的方法可以做到这一点? 编辑:更正的长度方法。 问题答案: 稍有改进,但是在主循环之后,当到达另一个输入数组的末尾时,可以用来复制其中一个输入数组的结尾。但是,那不会改变你解决方案的性能特征。

    • 在研究合并k个排序的连续数组/向量的问题以及它在实现上与合并k个排序的链表有何不同时,我发现了两个相对简单的用于合并k个连续数组的朴素解决方案和一个基于成对合并的很好的优化方法,该方法模拟了mergeSort()的工作原理。我实现的两个朴素解决方案似乎具有相同的复杂性,但在我进行的一个大型随机测试中,似乎一个比另一个效率更低。 我天真的合并方法如下所示。我们创建一个输出向量 我的第二个天真解决方案

    • 问题内容: 给定两个排序数组,如下所示: 我希望输出为: 要么: 我知道我可以执行以下操作: 我只是想知道是否有一种更快的方法,因为我要处理的数组具有数百万个元素。 任何想法都欢迎。谢谢 问题答案: 由于您使用numpy,因此我怀疑bisec根本不会对您有所帮助。因此,我建议您做两件事: 千万 不能 使用,使用方法,而不是这种种取代阵列,避免了复制。 必须使用没有到位的。因此,不要手动使用逻辑。I

    • 我试图找出哪种是执行以下任务的最快方法: 编写一个函数,接受两个数组作为参数——每个数组都是一个排序的严格升序的整数数组,并返回一个新的严格升序的整数数组,其中包含两个输入数组中的所有值。 例如,合并[1,2,3,5,7]和[1,4,6,7,8]应该返回[1,3,4,5,6,7,8]。 由于我没有受过正规的编程教育,我觉得算法和复杂性有点陌生:)我有两种解决方案,但我不确定哪一种更快。 解决方案

    • 问题是== 将nums1和nums2合并到一个按非递减顺序排序的数组中。 最终排序的数组不应由函数返回,而应存储在数组 nums1 中。为了适应这种情况,nums1 的长度为 m n,其中前 m 个元素表示应合并的元素,最后 n 个元素设置为 0 并应忽略。nums2 的长度为 n。 我的代码中有什么错误??? 您的意见 我的产出 预期产出

    • 我在Java中有一个数组,其中包含一组随机日期: {2015年1月20日、2015年2月12日、2015年2月20日、2015年6月21日、2015年7月12日、2015年7月28日、2015年7月30日、2015年9月24日、2015年12月31日} 如何按月将此阵列拆分为多个阵列? 我想要 {2015年1月20日}、{2015年2月12日、2015年2月20日}、{2015年6月21日}、{2