JAVA,10万个Int值相加,怎么实现更有效率

10万个int值相加,怎么实现更有效率。今天收拾面试题,看到以前被人问的这个题目。思索无果欢迎大家来讨论讨论!
昨天根据fonxian的回答试试了一下,发现并没有什么区别!我的实现有问题?使用线程的算法,可能是因为线程需要额外的开销所以会慢一点。使用map的就忽略了吧,map版本改了好多次都打不到想要的效果,看来map的开销好大。分开计算和合并计算并没有什么区别,分开计算的好处根本看不出来~~~~
2017-5-10感谢thomastao的提醒,我重新整理了下方法,可以看出来点门道了。我水平有限就不总结了。各位看看就好!
publicstaticvoidmain(String[]args){
IntSumTestt=newIntSumTest(10000000);
LongstartDate1=newDate().getTime();
//方法注释后的数值为执行时间(毫秒)
//先用map去重,然后相乘。最后将结果相加
t.mapCount();//7255825180027355
//开启多个线程相加,结果记录到sum数组中。最后将sum数组相加。
//t.threadCount();//5544545444
//一个线程相加分10次相加,结果记录到sum数组中。最后将sum数组相加。
//t.reduceCount();//4233334323
//直接相加
//t.count();//11101010101012131111
//使用计数方法
//t.countSum();//14151416121311121213
LongendDate1=newDate().getTime();
System.out.println(endDate1-startDate1);
}
publicclassIntSumTest{
int[]valueNum=newint[10000000];//1000w个数
publicIntSumTest(intmaxNum){
Randomr=newRandom();
for(inti=0;ivalueNum[i]=r.nextInt(maxNum);
}
}
/**
*直接计算
*@return
*/
publiclongcount(){
longsum=0;
for(inti=0;isum+=valueNum[i];
}
returnsum;
}
/**
*使用计数方法计算
*理论上的好处在于java栈内的管理方式是所有成员变量都会记录
*@return
*/
publiclongcountSum(){
longsum=0;
for(inti=0;isum=sum(sum,valueNum[i]);
}
returnsum;
}
publiclongsum(longsum,intnum){
returnsum+num;
}
/**
*使用数组计数,然后在各个数字相乘,得到结果
*该方法的好处在于可以释放大量对象
*缺点在于,如果数字的分布范围太大,效果就不明显
*/
publiclongmapCount(){
longsum=0;
Mapmap=newHashMap();
for(inti=0;imap.put(valueNum[i],map.get(valueNum[i])==null?0:map.get(valueNum[i])+1);
}
for(Map.Entryentry:map.entrySet()){
sum+=entry.getKey()*entry.getValue();
}
returnsum;
}
/**
*多线程计算,分10组计算,分别汇总结果
*/
publiclongthreadCount(){
longsum=0;
long[]sumNum=newlong[10];
for(inti=0;i<10;i++){
MyThreadmy=newMyThread(sumNum,valueNum,i);
my.run();
}
for(inti=0;i<10;i++){
sum+=sumNum[i];
}
returnsum;
}
/**
*分10组计算,分别汇总结果
*/
publiclongreduceCount(){
longsum=0;
long[]sumNum=newlong[10];
for(inti=0;i<10;i++){
inttemp=i*10000;
longmax=temp+10000;
for(intj=temp;jsumNum[i]+=valueNum[j];
}
}
for(inti=0;i<10;i++){
sum+=sumNum[i];
}
returnsum;
}
}
GCT1015
浏览 967回答 2
2回答

慕桂英546537

用MapReduce的思想或者多线程解决。10w个整数map成n组(例如10组),每组只需要计算1w的数的sum,然后reduce归约,10个sum相加。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript