首页 > 编程语言 >top k 问题 Java解决代码

top k 问题 Java解决代码

时间:2024-05-06 16:45:29浏览次数:31  
标签:maxHeap Java int top 元素 PriorityQueue occurrences new 代码

top k问题:从10亿个数中选出最大的1万个数,处理方式:用小顶堆,先用1万个数建立小顶堆,再把剩余数从小顶堆里过一遍,每次与堆顶元素比较,小顶堆的堆顶元素是最小的,如果比堆顶元素大就替换堆顶元素,重新生成小顶堆,继续比较直到10亿条数据比完,堆里剩下的就是最大的1万个数。
如果是从大量元素里挑出最小的前k个,就建立容量为k的大顶堆,堆顶是最大的元素,剩余元素跟堆顶元素比较,如果堆顶元素大就替换掉。
大顶堆,小顶堆如何建立,在java代码中有现成的堆数据结构PriorityQueue(也可以用数组自己建立堆数据结构,替换堆顶元素重新排序需要自己写方法实现),默认是小顶堆,想要大顶堆就重写compare方法

一: 用PriorityQueue找出前k个最小元素:

public static int[] topK(int[] arr,int k){
// 创建一个大小为 k的大根堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(k,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
for (int i = 0; i < arr.length; i++) {
if (i < k){
// 放入前 k 个元素
maxHeap.offer(arr[i]);
}else{
// 从第 k+1个元素开始进行判断是否要入堆
if (maxHeap.peek() > arr[i]){
maxHeap.poll();
maxHeap.offer(arr[i]);
}
}
}
int[] ret = new int[k];
for (int i = 0; i < k; i++) {
ret[i] = maxHeap.poll();
}
return ret;
}

 

二 top k找出出现频率最大的前k条:

先用hash结构获取元素值和出现的次数,再将hash结构放到堆中用频次比较:

public int[]topKFrequent(int[]nums,int k){
//occurrences的key是元素值,value是元素出现的次数
Map<Integer,Integer> occurrences = new HashMap<Integer,Integer>();
for(int num:nums){
//occurrences.getOrDefault(key,def)是根据key获取value值,如果找不到key就返回默认值def
//第一次occurrences为空都找不到,值是1,后面能找到了每次加一
occurrences.put(num,occurrences.getOrDefault(num,0)+1);
}
PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>(){
//PriorityQueue是Java的堆数据结构,这里存放的是整形数组,下标0存key,下标1存出现次数
//重写compare方法,指定用频次比较
public int compare(int[]m,int[]n){return m[1]- n[1];}
});
for(Map.Entry<Integer,Integer>entry : occurrences.entrySet()){
int num=entry.getKey(),count=entry.getValue();
if(queue.size()==k){
if(queue.peek()[1]<count) {//堆顶元素下标1是频次,和数组的其他元素的频次比较
//删除堆顶元素
queue.poll();
//堆中加入元素
queue.offer(new int[]{num, count});
}
}else{
//堆中加入元素
queue.offer(new int[]{num, count});
}
}

int[]ret = new int[k];
for(int i=0;i<k; ++i){
ret[i]= queue.poll()[1];
}
return ret;
}

  

标签:maxHeap,Java,int,top,元素,PriorityQueue,occurrences,new,代码
From: https://www.cnblogs.com/1--2/p/18175321

相关文章

  • Java 集合框架的collection接口和map接口
    集合框架中整体的架构分为2类:Collection接口和Map接口Collection接口:用于存储单个对象的典型的实现类:List--->ArryListLinkedListSet--->HashSetThreeSetMap接口:用于存储K-V键值对双对象的典型的实现类:HashMap一、ArrayList1.1、简介数据存储:底层采用的是数组,但是采......
  • Java Web 相关
    页面静态页面:即静态网页,是实际存在的,无需经过服务器的编译,直接加载到客户浏览器上显示出来。静态页面需要占一定的服务器空间,且不能自主管理发布更新的页面,如果想更新网页内容,要通过FTP软件把文件DOWN下来用网页制作软件修改(通过fso等技术例外)。常见的静态页面举例:.html扩......
  • 《代码随想录》-2.二分查找
    前提:1.有序2.无重复//版本1intleft=0;intright=nums.size()-1;while(left<=right){intmiddle=left+(right-left)/2;//防止溢出if(nums[middle]>target){right=milddle-1;}elseif(nums[middle]<target{left=middle+1;}else{returnmiddle;......
  • JavaGUI - [04] BoxLayout
    题记部分  一、简介  为了简化开发,Swing引入了一个新的布局管理器:BoxLayout。BoxLayout可以在垂直和水平两个方向上摆放GUI组件,BoxLayout提供了如下一个简单的构造器:BoxLayout(Containertarget,intaxis)  指定创建基于target容器的BoxLayout布局管理器,该布局管理......
  • Java Object类有那些方法,分别作用
    1.类构造器是创建Java对象的途径之一,通过new关键字调用构造器完成对象的实例化,或通过构造器对象进行相对应的初始化。在JDK的Object类源码中,系统会自动添加一个无参构造器。publicObject(){Objectobj=newObject();//构造一个Object类的对象}2.registerNatives......
  • Java面向对象编程概念
    面向对象编程(OOP)概念,如类、对象、继承、封装、多态概念:面向对象编程(Object-OrientedProgramming,简称OOP)是一种程序设计范型或编程范式。这种范式使用“对象”来设计应用程序和系统的各个部分。在面向对象编程中,万物皆对象,程序被视作一系列对象的集合,这些对象通过消息传递来交互......
  • JavaGUI - [03] LayoutManager布局管理器
    Component中有一个方法setBounds()可以设置当前容器的位置和大小,但如果我们手动为组件设置位置和大小的话,就会造成程序的不通用性。LayoutManager布局管理器可以根据运行平台来自动调整组件大小,程序员不用再手动设置组件的大小和位置,只需要为容器选择合适的布局管理器即可。 ......
  • Java中的自增自减
    在Java中,自增(++)和自减(--)是两种特殊的运算符,用于在表达式的计算过程中增加或减少变量的值。它们有两种形式:前缀形式(++variable或--variable)和后缀形式(variable++或variable--)。这两种形式在表达式中的行为有所不同。前缀形式++variable:先增加变量的值,然后返回增加后的值。--......
  • JavaScript-DOM简介
    JavaScript-DOM简介之前我们说过JavaScript有三部分组成ECMAscript,BOM,DOM,之前我们都在了解JavaScript的语法即ECMAScript,今天我们开始了解DOM(文档对象模型(DocumentobjectModel),操作网页上的元素的API)什么是DOMDOM:DocumentObjectModel,文档对象模型。DOM为文档提供了结......
  • Java基本数据类型
    byte:字节型,8位二进制数,有符号,取值范围:-128到127。默认值:0示例:bytemyByte=10;空间大小:1字节(byte),即8位(bit)。short:短整型,16位二进制数,有符号,取值范围:-32,768到32,767。默认值:0示例:shortmyShort=2000;空间大小:2字节(byte),即16位(bit)int:整型,32位二进制数,有符号,取值范......