1亿数字中找出重复次数TopN的问题
生活随笔
收集整理的這篇文章主要介紹了
1亿数字中找出重复次数TopN的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*** @Date 2020/7/3* @param dataSize 數據量的大小* @param randomNumRange 產生隨機數的范圍* @param topN 找出重復次數前N的。* @return void* @Description 在大數據量的數字中查找重復次數前N個的數字
*/public static void repeatTopN(int dataSize,int randomNumRange,int topN){long start = System.currentTimeMillis();int maxValue = randomNumRange;Map<Integer,Integer> map1 = new HashMap<Integer,Integer>();//存放key:數字 value:出現次數Map<Integer, List<Integer>> map2 = new HashMap<Integer,List<Integer>>();//存放 key:出現次數 value:數字Random r = new Random();for(int i = 0 ; i < dataSize ; i++){int number = r.nextInt(maxValue);int count = 1;if(map1.containsKey(number)){count = map1.get(number)+1;map1.put(number,count);}else{map1.put(number,1);}if(map2.containsKey(count)){//這里需要優化。出現次數最多的數字會在之前出現次數的List集合都存在。map2.get(count).add(number);}else{List list = new ArrayList<Integer>();list.add(number);map2.put(count,list);}}BitSet bs = new BitSet(); //使用BitSet的位向量 原理。對應下標位置如果設置則為true,否則為false//設置出現次數為bs對應下標的設置,這樣最大下標所對應的值為true。for(Map.Entry<Integer,Integer> entry : map1.entrySet()){bs.set(entry.getValue());}//注意:這里使用TreeSet 是為了解決上面最多出現次數的數字會在之前的list都出現一遍,為了去重和按照順序插入到result中Set <Integer> result = new TreeSet<Integer>();//倒序循環bs。只要值為true的。說明是出現過的最大次數。然后倒序輸出,使用出現次數從map2中查找對應的數字列表, 查找topN個數字。a:for(int j = bs.size();j>=0;j--){ //這里bs的size是2的n次冪。if(bs.get(j)){b:for(Integer num : map2.get(j)){if(result.size() > topN){ //result的大小 大于用戶需要取出的topN。退出循環break a;}//取出重復次數前topN的數字boolean flag = result.add(num);if(flag){//如果是不重復并且增加進去的則輸出數字出現的次數。System.out.println("["+num +"]出現過:"+j+"次");}}}}long end = System.currentTimeMillis();System.out.println(result);System.out.println("共耗時:"+((end-start)/1000) +"秒");}public static void main(String[] args) {repeatTopN(100000000,1000,5);
}
以上是對這個問題單臺機器單線程的實現方式,里面有需要優化的地方,暫時沒有實現。忘大神多多指教。
總結
以上是生活随笔為你收集整理的1亿数字中找出重复次数TopN的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机在本专业的应用小论文,计算机应用论
- 下一篇: 饲料企业管理系统饲料加工行业erp管理软