优先级队列建立小根堆来解决前K个高频元素(TOP K问题)

news2024/11/24 9:39:46

目录

场景一:解决前K个高频元素需要解决如下几个问题:

优先级队列PriorityQueue

堆的定义

题目链接

场景二:亿万级数据取前TOP K / 后TOP K 数据


场景一:解决前K个高频元素需要解决如下几个问题:

1.记录每一个元素出现的频率  (解决方法:使用hashmap来记录元素出现个数)

2.对出现频率次数进行排序      (解决方法:使用优先级队列建立小根堆来进行排序)

3.选择前K个排序大的元素      (解决方法:遍历小根堆前K个元素并逆序打印,因为小顶堆先弹出的是最小的,所以倒序来输出到数组


问题1:记录出现频率使用hashmap记录次数即可,这里就不过多阐述

问题2:对出现频率次数进行排序使用小根堆来解决问题

优先级队列PriorityQueue

优先级队列PriorityQueue就是一个披着队列外衣的堆,因为优先级队列对外接口只是从队头取元素,从队尾添加元素,再无其他取元素的方式,看起来就是一个队列。

而且优先级队列内部元素是自动依照元素的权值排列。那么它是如何有序排列的呢?

缺省情况下PriorityQueue利用max-heap(大顶堆)完成对元素的排序,这个大顶堆是以vector为表现形式的complete binary tree(完全二叉树)。

堆的定义

堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。 如果父亲结点是大于等于左右孩子就是大根堆,小于等于左右孩子就是小根堆。

所以大家经常说的大根堆(堆头是最大元素)小根堆(堆头是最小元素)。

如果自己不想代码实现堆的话,就可以直接使用PriorityQueue(优先级队列)就可以了,底层实现都是一样的,从小到大排就是小根堆,从大到小排就是大根堆

最大前TOP K 高频元素就使用优先级队列建立小根堆

原因:定义一个大小为k的大根堆,在每次移动更新大根堆的时候,每次弹出都把最大的元素弹出去了,那么怎么保留下来前K个高频元素呢。

           因此取前TOP K 高频元素就需要建立小根堆,因为小根堆每次更新元素时都是把最小元素弹出去,这样最大元素就保留下来了

最小前TOP K 元素就使用优先级队列建立大根堆

原因:大根堆每次更新元素都是把最大元素弹出去,这样最小元素就保留下来了

问题3:打印前K个高频元素

因为小根堆元素的堆顶元素是最小的,遍历小根堆元素时是从小到大遍历的,小根堆弹出元素先是最小元素弹出,取前K个高频元素就需要逆序打印元素

题目链接

力扣题目:347. 前 K 个高频元素

 代码如下:

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        //思路:使用map记录每个元素的次数,利用优先级队列建立小根堆来解决TOP K问题
        // 大根堆(堆头是最大元素,从大到小排),小根堆(堆头是最小元素,从小到大排)
        Map<Integer,Integer> map = new HashMap<>();
        for(int num : nums){
            map.put(num,map.getOrDefault(num,0)+1);
        }
      
      //建立小根堆(每次插入元素都把最小元素弹出去,即最后保留下来的元素都是大元素)
        PriorityQueue<Integer> queue = new PriorityQueue<>((a,b) -> map.get(a) - map.get(b)); //lambda表达式
        for(int key : map.keySet()){ //keySet()为返回所有 key 的不重复集合
            queue.offer(key);
            if(queue.size() > k){
                queue.poll();
            }
        }

        //打印小根堆前K个元素,因为小根堆先弹出的是最小的,所以倒序来输出到数组
        int[] array = new int[k];
        for(int i=k-1;i >=0;i--){
            array[i] = queue.poll();
        }
        return array;
    }
}

场景二:亿万级数据取前TOP K / 后TOP K 数据

在亿万级数据时,不可能一个一个数据排序再去取前TOP K 数据,这会大大降低效率。

有效的方法:

1、先将这亿万数据划分为一定数量的大分区,每个大分区的数据量相同,然后再把每个大分区进行划分一定数量的小分区,每个小分区数据量相同。

2、对于每一个小分区使用小根堆或者大根堆来得到前TOP K 或者后TOP K 数据元素,最后再合并一个大分区里面所有的小分区

3、然后使用小根堆或者大根堆得到每一个大分区的TOP K元素,最后在进行大分区合并使用小根堆或者大根堆来得到TOP K 数据。

注意:若亿万数据有许多重复值,可以先使用HashSet 进行去除重复元素 再进行上述操作。

对于海量数据处理取TOP K 数据,思路基本上是:必须分块处理,然后再合并起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】4.工具:读取ini配置信息

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍读取ini配置信息。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&…

医院PACS系统的发展历史

PACS全称Picture Archivingand Communication Systems。它是应用在医院影像科室的系统&#xff0c;主要的任务就是把日常产生的各种医学影像&#xff08;包括核磁&#xff0c;CT&#xff0c;超声&#xff0c;X光机&#xff0c;红外仪、显微仪等设备产生的图像&#xff09;通过各…

【工程应用八】终极的基于形状匹配方案解决(小模型+预生成模型+无效边缘去除+多尺度+各项异性+最小组件尺寸)...

我估摸着这个应该是关于形状匹配或者模版匹配的最后一篇文章了&#xff0c;其实大概是2个多月前这些东西都已经弄完了&#xff0c;只是一直静不下来心整理文章&#xff0c;提醒一点&#xff0c;这篇文章后续可能会有多次修改(但不会重新发文章&#xff0c;而是在后台直接修改或…

【MySQL 日志管理、备份与恢复】

目录 一、数据库备份的分类1、从物理与逻辑的角度1.1、物理备份: 对数据库操作系统的物理文件&#xff08;如数据文件&#xff0c;日志文件等&#xff09;的备份1.2、逻辑备份 2、从数据库的备份策略角度3、常见的备份方法3.1、物理冷备3.2、专用备份工具mysqldump 或者 mysqlh…

【Windows系统】windows服务

概述 Microsoft Windows 服务&#xff08;即&#xff0c;以前的 NT 服务&#xff09;使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动&#xff0c;可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服…

C++算法:多源最短路径(Floyd)

文章目录 前言一、Floyd算法二、代码实现总结 前言 前文单源最短路径Dijkstra中我们讨论了如何解决有向无环图的最短路径问题&#xff0c;Dijkstra只能解决一个起始点的问题&#xff0c;如果要解决每个顶点到任一顶点的最短路径呢&#xff1f;一个方法就是再循环一次&#xff…

ASEMI代理光宝高速光耦LTV-60L规格,LTV-60L封装

编辑-Z LTV-60L参数描述&#xff1a; 型号&#xff1a;LTV-60L 封装&#xff1a;LSOP-6 储存温度TST&#xff1a;-55~125℃ 工作温度TA&#xff1a;-40~105℃ 隔离电压VISO&#xff1a;5000VRMS 电源电压VCC&#xff1a;7V 平均正向输入电流IF&#xff1a;20mA 输入功…

电脑滤镜软件哪个好 滤镜调色有什么技巧

无论是图片还是视频&#xff0c;滤镜的作用都很大&#xff0c;通过滤镜改变色彩&#xff0c;能让图片或视频增加故事性和美感。电脑滤镜软件哪个好, 电脑滤镜软件有很多&#xff0c;这里我们主要介绍几款视频滤镜软件。滤镜调色有什么技巧&#xff1f;有模板的&#xff0c;我们…

api-hook,更轻量的接口测试工具

目录 前言 现状 api-hook优势 研发介绍 最后 前言 api-hook是一种轻量级的接口测试工具&#xff0c;它基于Python语言编写&#xff0c;可以通过配置文件定义接口测试用例&#xff0c;支持HTTP和HTTPS协议&#xff0c;并提供了灵活的校验机制和数据处理方式。 在网站的开发过…

Tailwindcss 入门

Tailwindcss 是一个功能类优先的 CSS 框架&#xff0c;通过 flex, pt-4, text-center 和 rotate-90 这种原子类组合快速构建网站&#xff0c;而不需要离开你的 HTML。就是记住原子类&#xff0c;不要再自己想 CSS 命名一股脑子写 HTMl 就行了&#xff01; 它与常规的 Bootstra…

佩戴舒适度极好的蓝牙耳机推荐,久戴不累的蓝牙耳机推荐

无论是在日常还是运动的场景下&#xff0c;我们通常都会选择佩戴着耳机&#xff0c;让我们能够释放压力&#xff0c;缓解枯燥的生活。可是&#xff0c;随着市面上的蓝牙耳机层出不穷、各种各样&#xff0c;导致很多小伙伴不知如何选购耳机了&#xff0c;下面我来给大家分享几款…

循踪讲述:成都的夜,有一盏灯为你亮

成都的夜晚总是这样&#xff0c;热闹而梦幻。霓虹灯下的酒吧一条街&#xff0c;你看着手里冒着蒸汽的小龙虾&#xff0c;却心里想着那个人。那个曾经一起在脚手架上挥汗如雨&#xff0c;携手走过平淡岁月&#xff0c;然后在灯红酒绿的生活里逐渐远离的人。 他&#xff0c;一个手…

【数据治理-06】做好数据分类分级,为数据安全有序流动保驾护航

我们常说人以类聚&#xff0c;物以群分&#xff0c;确实是这样&#xff0c;杜威说过“所有知识都是分类”&#xff01;很好理解&#xff0c;分类是认知经济&#xff0c;任何有效分类&#xff0c;都可以极大地节省我们的认知精力。数据分类分级具体说来&#xff0c;其实包含了2个…

欢迎来到 VOXEL WARS!

Sandbox Streams 的全新节目&#xff0c;我们希望你们能参与其中&#xff01; 我们正在寻找 15 名 Voxedit 艺术家&#xff0c;他们将需要抽出 1 小时进行现场表演&#xff08;仅限屏幕共享&#xff09;&#xff0c;并在节奏快速的环境中进行创作&#xff0c;以赢得“最佳快速设…

报道 | 7月国际运筹优化会议汇总

七月召开会议汇总&#xff1a; 30th International Annual EurOMA Conference Location:Leuven Important dates: Conference: July 3, 2023 - July 5, 2023 Details:https://euroma2023.org/ The Equilibrium Computation Workshop at EC Location:Kings College London…

STM32速成笔记—ADC

文章目录 一、什么是ADC二、ADC的用途三、STM32F103ZET6的ADC3.1 ADC通道对应引脚3.2ADC时钟3.3 ADC工作模式3.4 ADC转换时间3.5 ADC校准3.6 ADC转换结果与实际电压的换算 四、ADC配置步骤五、ADC配置程序5.1 ADC初始化程序5.2 软件触发AD转换5.3 读取AD转换结果 六、实战项目6…

运动健身APP开发需要具备哪些功能?

想要开发一款运动健身APP软件&#xff0c;需要具备哪些功能呢&#xff1f; 1、用户注册和登录&#xff1a;用户通过个人信息注册健身APP&#xff0c;登陆之后建立个人账号&#xff0c;以后使用秩序登录自己的账号就可以记录和追踪自己的健身计划和成果。 2、个人…

【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

&#x1f3c6;&#x1f3c6;时间过的真快&#xff0c;这是导师回顾新星计划学习的第六篇文章&#xff01; 最近这段时间非常忙&#xff0c;虽然导师首次参与新星计划活动已经在4月16日圆满结束&#xff0c;早想腾出时间来好好整理活动期间分享的知识点。 &#x1f3c6;&#x1…

机器学习:问题构建及框架化

机器学习作为一种解决方案&#xff0c;并不是“万金油”&#xff0c;它只适用于一些特定的场景。在实际应用中&#xff0c;我们首先需要进行问题构建——即通过分析问题以隔离需要解决的各个元素的过程。问题构建有助于确定项目的技术可行性&#xff0c;并提供一组明确的目标和…

应届生软件面试自我介绍(合集)

应届生软件面试自我介绍篇【1】 尊敬的领导&#xff1a; 您好! 我是中南大学(原中南工业大学)冶金科学与工程学院2014年轻金属冶金专业应届毕业生。在此临近毕业之际&#xff0c;我希望能得到贵单位的赏识与栽培。为了发挥自己的才能&#xff0c;特向贵单位自荐。自我介绍 中南…