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();//14151416121311121213LongendDate1=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
慕桂英546537
随时随地看视频慕课网APP
相关分类