JAVA,10万个Int值相加,怎么实现更有效率
问题描述
10万个int值相加,怎么实现更有效率。今天收拾面试题,看到以前被人问的这个题目。思索无果欢迎大家来讨论讨论!
昨天根据fonxian的回答试试了一下,发现并没有什么区别!我的实现有问题?使用线程的算法,可能是因为线程需要额外的开销所以会慢一点。使用map的就忽略了吧,map版本改了好多次都打不到想要的效果,看来map的开销好大。分开计算和合并计算并没有什么区别,分开计算的好处根本看不出来~~~~
2017-5-10感谢thomastao 的提醒,我重新整理了下方法,可以看出来点门道了。我水平有限就不总结了。各位看看就好!
public static void main(String[] args) {IntSumTest t = new IntSumTest(10000000);Long startDate1 = new Date().getTime();//方法注释后的数值为执行时间(毫秒)//先用map去重,然后相乘。最后将结果相加t.mapCount(); //7255 8251 8002 7355//开启多个线程相加,结果记录到sum数组中。最后将sum数组相加。//t.threadCount(); //5 5 4 4 5 4 5 4 4 4//一个线程相加分10次相加,结果记录到sum数组中。最后将sum数组相加。//t.reduceCount(); //4 2 3 3 3 3 4 3 2 3//直接相加//t.count();//11 10 10 10 10 10 12 13 11 11//使用计数方法//t.countSum(); //14 15 14 16 12 13 11 12 12 13Long endDate1 = new Date().getTime();System.out.println(endDate1- startDate1 ); }
public class IntSumTest { int[] valueNum = new int[10000000];//1000w个数 public IntSumTest(int maxNum){Random r = new Random();for(int i=0;i<valueNum.length;i++){ valueNum[i] = r.nextInt(maxNum);} } /** * 直接计算 * @return */ public long count(){long sum = 0;for(int i=0;i<valueNum.length;i++){ sum+= valueNum[i];}return sum; } /** * 使用计数方法计算 * 理论上的好处在于java栈内的管理方式是所有成员变量都会记录 * @return */ public long countSum(){long sum = 0;for(int i=0;i<valueNum.length;i++){ sum = sum( sum,valueNum[i]);}return sum; } public long sum(long sum ,int num){return sum+num; } /** * 使用数组计数,然后在各个数字相乘,得到结果 * 该方法的好处在于可以释放大量对象 * 缺点在于,如果数字的分布范围太大,效果就不明显 */ public long mapCount(){long sum = 0;Map<Integer,Integer> map = new HashMap<Integer,Integer>();for(int i=0;i<valueNum.length;i++){ map.put(valueNum[i],map.get(valueNum[i])==null?0:map.get(valueNum[i])+1);}for (Map.Entry<Integer, Integer> entry : map.entrySet()) { sum+= entry.getKey()*entry.getValue();}return sum; } /** * 多线程计算,分10组计算,分别汇总结果 */ public long threadCount(){long sum = 0;long[] sumNum = new long[10];for (int i = 0; i < 10; i++) { MyThread my = new MyThread(sumNum,valueNum,i); my.run();}for (int i = 0; i < 10; i++) { sum += sumNum[i];}return sum; } /** * 分10组计算,分别汇总结果 */ public long reduceCount(){long sum = 0;long[] sumNum = new long[10];for (int i = 0; i < 10; i++) { int temp = i*10000; long max = temp+10000; for (int j = temp; j < max; j++) {sumNum[i]+= valueNum[j]; }}for (int i = 0; i < 10; i++) { sum += sumNum[i];}return sum; }}
问题解答
回答1:用MapReduce的思想或者多线程解决。10w个整数map成n组(例如10组),每组只需要计算1w的数的sum,然后reduce归约,10个sum相加。
回答2:一般来说先肉眼看有没有规律,有规律了用公式算,没规律了就老老实实的一个一个加吧。。。
相关文章:
1. spring - 关于关键字查询中遇到的问题:sql语句写到java中去的问题2. javascript - 小程序如何点击获取下标3. javascript - 有没有人在做网页微信支付遇到如下问题4. javascript - 求助canvas绘制马赛克的问题,老是取色不准5. javascript - H5移动端开发6. javascript - 手机网页上实现调用相册或者拍照或者录制短视频上传,有没有人有做过相关功能,求告知,项目用,急!!!7. javascript - 使用animation-defer或者 setimeout 来延迟为什么会造成animation的卡顿,而不使用延迟是很流畅的?8. javascript - 如何做出pc网站随鼠标滚动动态出现效果9. java - mysql缓存问题10. javascript - 用localstorage删除某个key下的某条数据

网公网安备