将许多短排序列表有效地合并到长排序列表中

时间:2011-07-29 16:49:47

标签: java arrays list merge

我反复将10000个排序列表合并到一个长排序列表中。每个列表包含大约5000 doubles

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;
}

此方法每次都分配一个新数组。随着result[]的增长,这效率不高。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

你显然有足够的内存来保存整个结果(400Mb是吗?)所以大概你可以拥有所有的源800Mb是大的,但不是太大?然后,您可以在开始时快速分配整个答案缓冲区。

如果你准备使用更多的记忆,你可以采取“倍增”的方法。

合并1&amp; 2形成A1,3和&amp; 4到A2等形式直到A2500(你现在可以丢弃第一级阵列)

然后合并A1和A2以形成B1; A3&amp; A4形成B2到B1250(你现在丢弃A阵列)

依旧产生C1-C625,D1-D313,E1-E157 ...... M1,这是最终答案

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

答案 2 :(得分:0)

将您的问题视为merge-sort的合并部分。创建2个足够大的数组,以保存所有小列表的内容。然后在合并步骤中交替使用它们进行源存储和目标存储。