色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

JAVA,10萬個Int值相加,怎么實現更有效率

瀏覽:88日期:2023-12-09 14:35:30

問題描述

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:

一般來說先肉眼看有沒有規律,有規律了用公式算,沒規律了就老老實實的一個一個加吧。。。

標簽: java
相關文章:
主站蜘蛛池模板: 欧美视频网站在线观看 | 久久视频这里只精品3国产 久久视频这里只有精品 | 99视频在线观看视频一区 | 国内精品免费一区二区观看 | 欧美日韩久久 | 美国一级大黄香蕉片 | 99精品国产综合久久久久 | 欧美成a人免费观看久久 | 国产大乳喷奶水在线看 | 毛片免费观看的视频在线 | 成人偷拍视频 | 2020毛片| 91小视频在线观看免费版高清 | 亚洲精品一二三四区 | 波多野结衣在线看片 | 国产精品第五页 | 欧美一级毛片香蕉网 | 成人高清无遮挡免费视频软件 | 欧美综合图片一区二区三区 | 最新99国产成人精品视频免费 | 成人网18免费下 | 国产亚洲片 | 毛片图片 | 国产日产精品_国产精品毛片 | 国产成人精品一区二区视频 | 亚洲国产日韩女人aaaaaa毛片在线 | 曰本毛片va看到爽不卡 | 国产一级做a爰片在线 | 欧美成人h版在线观看 | 国美女福利视频午夜精品 | 国产高清一国产免费软件 | 澳门一级特黄真人毛片 | 成人午夜视频在线播放 | 久久91精品国产91久久跳舞 | 日韩理论在线 | 国产美女高清一级a毛片 | 天堂一区二区三区在线观看 | 欧美成人777 | 久久精品国内一区二区三区 | 一级国产交换配乱淫 | 怡红院色视频在线 |