为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森栏 2019-03-01 10:45:48
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 13 Long 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; } }
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

用MapReduce的思想或者多线程解决。10w个整数map成n组(例如10组),每组只需要计算1w的数的sum,然后reduce归约,10个sum相加。

查看完整回答
反对 回复 2019-03-01
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

一般来说先肉眼看有没有规律,有规律了用公式算,没规律了就老老实实的一个一个加吧。。。

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 643 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信