加入并将已经排序的列表排序成一个大列表的最佳方法是什么?

时间:2016-04-29 06:58:59

标签: arrays multithreading algorithm list sorting

我有一个排序对象的列表(数组,而不是链表)。它不是一个很长的列表:3到20个元素,但大多数时候它可能是在较短的一端。此列表以及所有其他列表将来自HTTP请求。将有大约30-50个请求,每个请求产生具有相同数量元素的数组。我的代码现在的工作方式是请求是同步的。我意识到这样做效率不高,很快就会变成一些多线程,但是现在我还处于初始阶段。将所有这些数组连接成一个大的排序数组的最佳方法是什么?它是否会从请求返回每个数组并附加到结果数组?或者可能在所有请求完成后排序?既然没有那么多元素,相对而言,它是否重要?多线程会对解决方案产生影响吗?

我不确定数组在它们所持有的值中是否相似是否有所不同。例如: [100,200,300],[99,105,290],[115,215,280]

2 个答案:

答案 0 :(得分:0)

有一些明智的方法可以尝试,然后测量相对表现。

由于要排序的元素数量很少,与算法的渐近复杂度相比,实现排序算法的常数因素对整体性能的影响相对较大。

我会在一个数组中收集所有单独的范围,并在完成所有请求后对其进行排序;这将使您在排序时保持阵列热,而不是使用随机的其他处理来交错许多种类。

如果要排序的数字在一个小范围内,请通过计算排序对它们进行排序;所需的额外O(n)内存不应成为问题,因为n最多为1000个。

否则,由于序列由多个排序范围组成,插入排序可能表现良好,内循环预计不会循环多次,当它循环时,内部条件应该是具有良好的分支预测特性。

所有这一切,对于这么少的元素,很可能你选择的方法并不重要,所以只需收集数组中的所有元素并使用系统的库排序函数。

答案 1 :(得分:0)

将多个排序列表合并到一个列表中的最快方法是执行k-way merge

从一个空的优先级队列开始,如果你按升序排序,通常是一个小堆,并将每个列表中的第一个项目推送到堆上。存储在堆中的结构必须具有值(即数字)以及对其来源列表的引用。然后:

  1. 从堆中弹出第一个项目并将其值添加到输出中。
  2. 从包含刚刚从堆中弹出的项目的列表中取出下一个项目,并将其添加到堆中。
  3. 继续,直到堆为空。
  4. 简而言之,min-heap总是从每个列表中有一个项目,这些项目中最低的一个始终是堆上的第一个项目。由于单个列表是为了开始,这可以保证堆顶部的项始终是所有列表中最小的剩余项,因此它是下一个输出的项。