使用PriorityQueue创建大小堆,解决TOPK问题

集合框架中的PriorityQueue底层使用堆结构,因此其内部的元素必须要能够比大小,PriorityQueue采用了: Comparble和Comparator两种方式。

  1. Comparble是默认的内部比较方式,如果用户插入自定义类型对象时,该类对象必须要实现Comparble接 口,并覆写compareTo方法

  2. 用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现 Comparator接口并覆写compare方法。

创建大小堆,先实现比较器

java 复制代码
//小根堆
class LessComp implements Comparator<Integer> {

    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;
    }
}
//大根堆
class GreaterComp implements Comparator<Integer> {

    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
}

例如找到最大的k个数

java 复制代码
    public int[] maxKey(int[] array, int k) {
        if(k < 0){
            return null;
        }
        LessComp gc = new LessComp();
        PriorityQueue<Integer> pq = new PriorityQueue<>(gc);
        for(int i = 0; i < k; i++){
            pq.offer(array[i]);
        }

        for(int i = k; i < array.length; i++){
            int top = pq.peek();
            if(top < array[i]){
                pq.poll();
                pq.offer(array[i]);
            }
        }
        int[] result = new int[k];
        for(int i = 0; i < k; i++){
            result[i] = pq.poll();
        }
        return result;
    }

要维护一个长度为k的小根堆,堆顶是堆里最小的数,然后开始比较,将大于堆顶的数入队,内部会进行向上调整,依次将剩下的数据处理。本例是找最大的k个数,要维护一个小根堆,反之,找最小的k个数,就维护一个大根堆。但要注意入堆的条件。

当维护小根堆的时候,只有当新数据比堆顶大时,才入堆。(最大的前k个数)

当维护大根堆的时候,只有当新数据比堆顶小时,才入堆。(最小的前k个数)

相关推荐
Chester_19997 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲9 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员9 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导9 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan9 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_695251499 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
2601_9619017010 小时前
SpringBoot使用Nacos进行application.yml配置管理
java·spring boot·spring
何以解忧,唯有..10 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
大衛說11 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
QQ_216962909611 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端