javascript - 在 Javascript 中合并 n 个排序数组

标签 javascript arrays algorithm

我有 n 个(n 在 1 到 100 之间)排序的数字数组,每个数组有 m 个元素(在我的例子中 m 大约为 1000)。我想将它们合并到一个排序的数组中。

我可以想到这样做的两种可能性:

1.使用两个数组合并算法(比如下面来自 http://www.nczonline.net/blog/2012/10/02/computer-science-and-javascript-merge-sort/merge() 函数)并迭代应用它(第 1 和第 2,然后合并第 1-2 和第 3,等等)

  function merge(left, right) {
      var result  = [],
        il      = 0,
        ir      = 0;
      while (il < left.length && ir < right.length){
        if (left[il] < right[ir]){
            result.push(left[il++]);
        } else {
            result.push(right[ir++]);
        }
    }
    return result.concat(left.slice(il)).concat(right.slice(ir));
}
  1. merge() 函数同时推广到 n 个数组。在每次迭代中,我会选择 n 个尚未处理的第一个值中的最小值并将其附加到结果中。

这两个算法在复杂性方面是否相同?我感觉这两种算法都在 o(m*n) 中。我说得对吗?

采用一种算法而不是另一种算法是否有任何性能考虑?我感觉 1 比 2 简单。

最佳答案

使用优先级队列(例如基于二叉堆)合并 n 个数组。
整体元素数为 m*n,因此算法复杂度为 O(m * n * Log(n))。 算法示意图:

Add numbers 1..n to priority queue, using 1st element of every 
array as sorting key 
(you may also use pairs (first element/array number).
At every step - 
  J = pop_minimum
  add current head of Jth array to result
  move head of Jth array to the right
  if Jth array is not exhausted, insert J in queue (with new sorting key)

第一个算法的复杂度是

2*m + 3*m+ 4*m+...+n*m = m * (n*(n-1)/2-1) =  O(n^2 * m)

关于javascript - 在 Javascript 中合并 n 个排序数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26935447/

相关文章:

javascript - 使用 jQuery/Javascript 编辑 CSS3 动画

javascript - 来自 wordpress postmeta 表键的多个值

javascript - Angular 4 typescript : Cannot read property 'list' of undefined

algorithm - 实时获取网站排名信息

c++ - 计算空字符单元格 C++

algorithm - 使用动态规划时,捕获整个路径以获得最小和?

javascript - 覆盖 Angular 的 Service Worker 来处理 POST 请求

javascript - 在 javascript ribon/command bar 规则中访问 Web 资源

c - C 中数组可以保存超出范围的值

java - 如何在java中创建图像数组?