在大规模数据处理中,经常会遇到这类问题:在海量数据中找到出现频率/数值最大的前K个数
本文主要提供这类问题的基本解决方法
假设这样一个场景,一个问题阅读量越高,说明这个问题越有价值,越应该推送给用户
假设数据量有1亿,取Top100
代码示例:
我们首先可以用HashMap去存储问题和阅读量的映射
//伪代码
String read;
HashMap<String, Integer> map = new HashMap<String, Integer>();
while (fileStream.hasNext()){
url = read();
if (map.containsKey(read)){
map.put(read,map.get(read)+1);
}else{
map.put(read, 1);
}
}
之后, 我们使用长度为100的最小堆来找到最热的100条数据。
PriorityQueue<Map.Entry<String, Integer>> queue =
new PriorityQueue<Map.Entry<String, Integer>>(100,
new Comparator<Map.Entry<String, Integer>>(){
@Override public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return o1.getValue() - o2.getValue();
}
});
int k = 100;
for (Map.Entry<String, Integer> entry : map.entrySet()){
if (queue.size() < k){
queue.add(entry);
} else {
if (entry.getValue() > queue.peek().getValue()){
queue.poll();
queue.add(entry);
}
}
}