我反复将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[]
的增长,这效率不高。有什么建议吗?
答案 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个足够大的数组,以保存所有小列表的内容。然后在合并步骤中交替使用它们进行源存储和目标存储。