基于PriorityQueue(优先队列)解决TOP-K问题
TOP-K问题是面试高频题目,即在海量数据中找出最大(或最小的前k个数据),隐含条件就是内存不够容纳所有数据,所以把数据一次性读入内存,排序,再取前k条结果是不现实的。
下面我们用简单的Java8代码去解决TOP-K问题。为了使主要的逻辑更加清晰,去掉了一些如参数合法性检查等非关键代码。
PriorityQueue(优先队列)是JDK1.5开始提供的,主要作者包括大名鼎鼎的纽约大学教授Doug Lea,他也是Java JUC包的鼻祖哦。
PriorityQueue相当于一个堆(默认为小根堆,如果想要创建大根堆,那么在创建PriorityQueue时应指定为逆序,代码如下)
new PriorityQueue<>(maxSize, Comparator.reverseOrder());
下面我们就以默认的小根堆去解决TOP-K问题(小根堆用于解决前k个最大值,而大根堆用于解决前k个最小值)
class FixSizedPriorityQueue {//自定义固定长度(k)的优先队列,因此可以解决Top-k问题
PriorityQueue<Integer> queue;
int k;
public FixSizedPriorityQueue(int k) {
this.k = k;
this.queue = new PriorityQueue<>(k);
}
public void add(Integer e) {
if (queue.size() < k) { //当前队列元素个数不足k个时,直接添加
queue.add(e);
} else { //超出k个时
if (e.compareTo(queue.peek()) > 0) {// 如果新元素大于了堆顶元素,说明新元素应替换掉当前堆顶元素
queue.poll();
queue.add(e);
}
}
}
}
public class Main {
public static void main(String[] args) {
final FixSizedPriorityQueue pq = new FixSizedPriorityQueue(10);
Random random = new Random();
random.ints(100, 0, 1000).forEach(pq::add);//产生100个0-1000的随机数,并加入自定义的定长优先队列
while (!pq.queue.isEmpty()) {
System.out.print(pq.queue.poll() + ", ");//不断取出堆顶元素,由于本例是小根堆,因此会从小到大打印出前10大的值
}
}
}
基于PriorityQueue(优先队列)解决TOP-K问题的更多相关文章
- 优先队列PriorityQueue实现 大小根堆 解决top k 问题
转载:https://www.cnblogs.com/lifegoesonitself/p/3391741.html PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于 ...
- 优先队列实现 大小根堆 解决top k 问题
摘于:http://my.oschina.net/leejun2005/blog/135085 目录:[ - ] 1.认识 PriorityQueue 2.应用:求 Top K 大/小 的元素 3 ...
- Top K问题的两种解决思路
Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如: 从20亿个数字的文本中,找出最大的前100个. 解决Top K问题有两种思路, 最直观:小顶堆(大顶堆 -> 最小1 ...
- Top k问题(线性时间选择算法)
问题描述:给定n个整数,求其中第k小的数. 分析:显然,对所有的数据进行排序,即很容易找到第k小的数.但是排序的时间复杂度较高,很难达到线性时间,哈希排序可以实现,但是需要另外的辅助空间. 这里我提供 ...
- [leetcode]347. Top K Frequent Elements K个最常见元素
Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...
- Top K问题-BFPRT算法、Parition算法
BFPRT算法原理 在BFPTR算法中,仅仅是改变了快速排序Partion中的pivot值的选取,在快速排序中,我们始终选择第一个元素或者最后一个元素作为pivot,而在BFPTR算法中,每次选择五分 ...
- 如何解决海量数据的Top K问题
1. 问题描述 在大规模数据处理中,常遇到的一类问题是,在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门 ...
- 基于visual Studio2013解决算法导论之007优先队列(堆实现)
题目 优先队列 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...
- 大数据热点问题TOP K
1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...
随机推荐
- IDEA个人常用配置记录
原文 一.常用快捷键 编辑 ⇧ + ↩:开始新的一行 ⌘ + ⇧ + ↩:行内任意位置进行换行,并自动补齐“;”.“{}” ⌘ + ⇧ + U:大小写切换 ⌥ + ⌦:删除到单词的末尾(⌦键为Fn+D ...
- python 查看源代码
使用包inspect import inspect from mxnet import contrib 查看模块所在路径: inspect.getsourcefile(contrib) 查看源码: i ...
- shell 拾遗
1, 按照行读取文件 while read line do echo ${line} done < ${filename} 2.循环中使用命令输出 while read line do echo ...
- 使用KerasNet
1.安装Python3.6,必须是3.6因为当前KerasNet的配套版本是3.6 https://www.python.org/ftp/python/3.6.8/python-3.6.8-amd64 ...
- Jmeter性能测试工具的使用(Web性能测试)
Jmeter性能测试工具的使用(Web性能测试) 1.下载 http://pan.baidu.com/s/1o7p18Ye 该软件不用安装,直接解压打开即可使用. 2.使用 这里就在win下进行,图形 ...
- 扩展:Zero Copy
- javascrip参考资料
阮一峰: http://javascript.ruanyifeng.com/ 廖雪峰: https://www.liaoxuefeng.com/ Mozila: https://developer.m ...
- React Native的生命周期
就像 iOS开发中 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命周期,是合理开发的关键.RN ...
- 简单wait(),notify()方法
1.两个类public class Name{ public static void main(String[] args) throws InterruptedException { User us ...
- 【JVM学习笔记】字节码文件结构
https://www.cnblogs.com/heben/p/11468285.html 比这篇笔记更好一点 新建一个Java类 package com.learn.jvm; public cla ...