从十亿数据中找出出现最多的数以及出现次数
2013-10-13 19:16
211 查看
package org.example.bigdata; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; public class TopTimes { public static void main(String[] args) { final int input[] = {2389,8922,3382,6982,5231,8934,8923,7593 ,4322,7922,6892,5224,4829,3829,8934,8922 ,6892,6872,4682,6723,8923,3492,9527,8923 ,7593,7698,7593,7593,7593,8922,9527,4322 ,8934,4322,3382,5231,5231,4682,9527,9527}; int sort[] = new int[1000]; //Set all bit to 0 for(int index = 0; index < sort.length; index++){ sort[index] = 0; } Map<Integer,Integer> numCountMap = new HashMap<Integer,Integer>(); for(int number : input){ //Every number takes 2 bit. int existTimes = (sort[number >>> 4] >>> (2 * (number % 16))) & (1 | 1 << 1); //Increase counter in sort array. if(existTimes <= ((1 | 1 << 1) - 1)){ existTimes++; //set two bit zero sort[number >>> 4] &= ~((1 | 1 << 1) << (2 * (number % 16))); //set increased bit value sort[number >>> 4] |= existTimes << (2 * (number % 16)); //set <number, counter> into two maps. if((1 | 1 << 1) == existTimes){ numCountMap.put(number, existTimes); } } else{ //Time >= 3, increase the counter in treemap. if((1 | 1 << 1) == existTimes){ int mapCounter = numCountMap.get(number).intValue(); mapCounter++; numCountMap.put(number, mapCounter); } } } List<CounterNumber> counterList = new LinkedList<CounterNumber>(); for(Integer number : numCountMap.keySet()){ counterList.add(new CounterNumber(numCountMap.get(number), number)); } Collections.sort(counterList); for(CounterNumber counterNumber : counterList){ System.out.println(counterNumber.getCounter() + "----" + counterNumber.getNumber()); } } } class CounterNumber implements Comparable<CounterNumber>{ private Integer counter; private Integer number; public CounterNumber(Integer counter, Integer number){ this.counter = counter; this.number = number; } public Integer getCounter(){ return this.counter; } public Integer getNumber(){ return this.number; } @Override public int compareTo(CounterNumber counterNumber){ return counterNumber.getCounter().compareTo(this.getCounter()); } }
大体思路和上一篇《从十亿数据找出最大的一百个数》差不多,不过原来1-Bit表示一个数,扩展为2^N位数来存储一个数出现次数,当出现次数超过2^N-1次时,把数据放入一个Map中。
根据长尾效应,排名靠前的数字出现次数很大,后面的数字剧减。某业务实际生产环境中,一亿条数据取Top一万的记录,排名第一的出现400万次,排名第10000位的出现不足5000次。
算法中是以数字来计算的,但是位于文本记录也有意义,可以将文本逐条计算出HashCode,再使用该算法。同时对Map/CounterNumber也进行相应的改造,加入原始文本字段。
相关文章推荐
- 海量日志数据,找出出现次数最多的IP地址。
- 一个文本文件中约有10万多行的数据,每个数据占一行(数据为一个整数)。要求:统计出总行数,并找出出现次数最多的那个整数。
- Excel用公式找出出现次数最多的数据
- 40w随机数据找出其中次数出现最多的那个数(类似于在10亿百度ip中找出访问次数最多的那个ip)
- 小程序(九)找出数组中出现最多的数字以及它的出现次数
- 找出一段文字中出现次数最多的前10个单词以及次数
- 找出一个字符串中重复最多的字符以及出现的次数
- 海量日志数据,找出出现次数最多的IP地址。
- python(dict字典相关知识以及小例子:生成一个列表,存放100个随机整数,找出出现次数最多的数字)
- J2EE面试题之 java如何找出一个int数组中出现次数最多的数字以及出现次数?
- 海量日志数据__怎么在海量数据中找出重复次数最多的一个;提取出某日访问网站次数最多的那个IP;提取出某日访问网站次数最多的前n个IP
- 算法系列-大数据面试题-在超大文件中找出访问百度次数最多的IP
- OC 找出在只有空格字母的字符串中出现次数最多的单词
- 生成一个列表,存放100个随机整数,找出出现次数最多的数字(可能不止一个)
- 找出给定字符串中出现最多的字符和次数
- 找出给定字符串中出现最多的字符和次数
- 找出一行字符串中的连续出现次数最多的字串
- 一个简单的算法---实现找出数组中一个数字出现次数最多的数字
- JAVA代码—算法基础:找出一维数组中重复次数最多的元素以及重复的次数
- 找出n个字符串中出现次数最多的字符串(创新工场)