Java 有效地将多个短排序列表合并为长排序列表

Java 有效地将多个短排序列表合并为长排序列表,java,arrays,list,merge,Java,Arrays,List,Merge,我反复将10000个排序列表合并为一个长排序列表。每个列表包含大约5000个双倍 double[] result;// this is the single long sorted list void merge(double[] x){ double[] newList=new double[x.length+result.length]; int i=0,j=0; while(i<x.length && j<result.length){

我反复将10000个排序列表合并为一个长排序列表。每个列表包含大约5000个
双倍

double[] result;// this is the single long sorted list
void merge(double[] x){
    double[] newList=new double[x.length+result.length];
    int i=0,j=0;
    while(i<x.length && j<result.length){
        insert the smaller one
        increment i or j;
    }
    if(i<x.length){
        add the rest
    }
    if(j<result.length){
        add the rest
    }
    result=newList;
}
double[]结果;//这是一个长排序列表
无效合并(双[]x){
double[]newList=newdouble[x.length+result.length];
int i=0,j=0;

虽然(i您可以像ArrayList一样处理它,每次需要重新分配时将数组长度增加一倍,然后仅在空间不足时重新分配。虽然最后可能会有相当多的剩余空间,但由于分配较少,您可以节省处理时间。然后只需使用Result和X进行就地合并即可

显然,您有足够的内存来保存整个结果(是400Mb吗?),因此您可能会保存所有源代码,因为800Mb大,但不会太大?然后您可以在开始时快速分配整个应答缓冲区

如果你准备使用更多的内存,你可以采取“加倍”的方法

合并1和2以形成A1,3和4以形成A2等,直到A2500(您现在可以放弃第一级阵列)

然后合并A1和A2形成B1;A3和A4形成B2,直至B1250(现在放弃A数组)

依此类推,得到C1-C625,D1-D313,E1-E157…M1,这是最终答案


这样,任何给定的数字都会移动15次,而目前每移动5000次。

将您的问题视为a的合并部分。创建两个数组,其大小足以容纳所有小列表的内容。然后在合并步骤中交替使用它们作为源存储和目标存储。

我认为:“合并1和2至表格A1,合并2和合并3至表格A2”应改为:“合并1和2至表格A1,合并3和合并4至表格A2?无需花哨。OP有已知数量的数组和已知数量的元素。如果空间不成问题,请将所有元素添加到树中,然后将树转换回列表。这样不仅节省空间,而且节省时间。如果时间不成问题,请在“头”处找到最小的元素时间复杂度会很糟糕,但空间会尽可能的高效。这是一个“只管做”的问题。