【算法】优先级队列-基础与应用

在这里插入图片描述
优先级队列(Priority Queue)是一种特殊的队列类型,它允许在其元素中分配优先级。与传统的先进先出(FIFO)队列不同,优先级队列中元素的出队顺序取决于它们的优先级。优先级较高的元素会被优先处理,即使它们是在优先级较低的元素之后被加入队列的。

优先级队列的特点:

  • 插入操作:新元素被添加到队列中时,它们根据自身的优先级被放置在适当的位置。
  • 移除操作:优先级队列通常移除并返回具有最高优先级的元素。
  • 查询操作:可以查询具有最高优先级的元素,而不从队列中移除它。

在Java中的实现:

Java标准库中的java.util.PriorityQueue类提供了一个基于优先级的队列实现。PriorityQueue底层使用了一种称为“堆”的数据结构,通常是二叉堆,以确保高效地维护元素的优先级顺序。

import java.util.PriorityQueue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        // 创建一个优先级队列
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

        // 插入元素
        priorityQueue.add(5);
        priorityQueue.add(1);
        priorityQueue.add(3);
        priorityQueue.add(4);
        priorityQueue.add(2);

        // 查看并移除优先级最高的元素
        while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.poll());
        }
    }
}

在这个例子中,PriorityQueue默认使用元素的自然排序(对于基本类型或实现了Comparable接口的对象)。如果需要自定义排序规则,可以通过构造函数传递一个Comparator实例。

自定义排序:

import java.util.Comparator;
import java.util.PriorityQueue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        // 创建一个优先级队列,使用自定义比较器
        PriorityQueue<String> priorityQueue = 
            new PriorityQueue<>(new Comparator<String>() {
                @Override
                public int compare(String s1, String s2) {
                    return s2.compareTo(s1); // 反向排序
                }
            });

        // 插入元素
        priorityQueue.add("Z");
        priorityQueue.add("A");
        priorityQueue.add("C");

        // 查看并移除优先级最高的元素
        while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.poll());
        }
    }
}

性能:

PriorityQueue提供了高效的插入和移除操作,时间复杂度通常为O(log n),其中n是队列中的元素数量。这是因为堆数据结构能够有效地维护元素之间的优先级关系,同时保持操作效率。

大顶堆/小顶堆

在这里插入图片描述

前K个高频元素

给定一个非空的整数数组,返回其中出现频率前 k 高的元素

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

思路:

    1. 统计元素出现的频率
    1. 对频率进行排序
    1. 找出前k个高频元素

构建一个优先级队列【小顶堆】,遍历map,将二元组存入小顶堆中【以频率进行排序】,维护优先级队列的长度为k,当有比小顶堆顶堆大的元素,直接弹出堆顶并加入新的节点。最后优先级队列中保存的就是前k高频的元素,直接弹出即可。

 public int[] topKFrequent(int[] nums, int k) {

    //1.使用map统计元素出现频率
    HashMap<Integer,Integer> map =  new HashMap<>();
    for(int num : nums){
        map.put(num,map.getOrDefault(num,0) + 1);
    }

    //2.将map中的元素以二元组的形式放入优先级队列中,并以频率为目标构建小顶堆
    PriorityQueue<int[]> queue = new PriorityQueue<>((pair1, pair2) ->
            pair1[1] - pair2[1]);
    //遍历map,放入优先级队列中
    for (Entry<Integer, Integer> entry : map.entrySet()){
        //小顶堆的大小小于k,直接放入
        if (queue.size() < k){
            queue.add(new int[]{entry.getKey(),entry.getValue()});
        }else {
            //小顶堆的大小大于k,与堆顶比较,如果大于堆顶,则弹出堆顶并加入堆
            if (queue.peek()[1] < entry.getValue()){
                queue.poll();
                queue.add(new int[]{entry.getKey(),entry.getValue()});
            }
        }
    }

    //3.依次弹出小顶堆中的key
    int[] res =  new int[k];
    int size = queue.size();
    for (int i = 0; i < size; i++) {
        res[i] = queue.poll()[0];
    }

    return res;

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数组移除元素算法(以JS为例)

题目&#xff1a;LeeCode第27题 答案&#xff1a; 算法思想&#xff1a;双指针 这段代码实际上使用了一种简化版的双指针技术来实现元素的移除。这里的双指针技术并不是传统意义上的两个指针&#xff0c;而是一个索引k作为辅助指针&#xff0c;用来记录新数组&#xff08;或原…

面试:关于word2vec的相关知识点Hierarchical Softmax和NegativeSampling

1、为什么需要Hierarchical Softmax和Negative Sampling 从输入层到隐含层需要一个维度为NK的权重矩阵&#xff0c;从隐含层到输出层又需要一个维度为KN的权重矩阵&#xff0c;学习权重可以用反向传播算法实现&#xff0c;每次迭代时将权重沿梯度更优的方向进行一小步更新。但…

机器学习基础:与Python关系和未来发展

目录 初识Python Python的由来 自由软件运动 编译方式的演进 Python语言的特点 语法简单&#xff0c;易于理解 语法结构清晰&#xff0c;快速上手 丰富的第三方库 机器学习 监督学习 无监督学习 半监督学习 欢迎回到我们的神经网络与深度学习Tensorflow实战学习&am…

Python 虚拟环境 requirements.txt 文件生成 ;pipenv导出pip安装文件

搜索关键词: Python 虚拟环境Pipenv requirements.txt 文件生成;Pipenv 导出 pip requirements.txt安装文件 本文基于python版本 >3.9 文章内容有效日期2023年01月开始(因为此方法从这个时间开始是完全ok的) 上述为pipenv的演示版本 使用以下命令可精准生成requirement…

thrift接口调用工具

写了一个thrift接口调用工具 导入thrift文件就可以直接调用相应接口 工具会根据thrift文件中接口的参数名&#xff0c;参数类型&#xff0c;返回值等等&#xff0c;自动生成接口参数&#xff0c;和结果json化显示。 https://github.com/HuaGouFdog/Fdog-Kit

Java启动jar设置内存分配详解

在微服务架构越来越盛行的情况下&#xff0c;我们通常一个系统都会拆成很多个小的服务&#xff0c;但是最终部署的时候又因为没有那么多服务器只能把多个服务部署在同一台服务器上&#xff0c;这个时候问题就来了&#xff0c;服务器内存不够&#xff0c;这个时候我们就需要对每…

1.3 Sqoop 数据同步工具详细教程

Apache Sqoop 是一个开源工具&#xff0c;用于在 Apache Hadoop 和关系型数据库&#xff08;如 MySQL、Oracle、PostgreSQL 等&#xff09;之间高效传输数据。Sqoop 可以将结构化数据从关系型数据库导入到 Hadoop 的 HDFS、Hive 和 HBase 中&#xff0c;也可以将数据从 Hadoop …

DIVE INTO DEEP LEARNING 50-55

文章目录 50. semantic segmentation50.1 Basic concepts50.2 Major application 51. Transposed convolution51.1 Basic concepts51.2 Major role51.3 Implementation steps and application areas51.4 Transposed convolution51.5 Transposed convolution is a type of convo…

物联网系统运维——移动电商应用发布,Tomcat应用服务器,实验CentOS 7安装JDK与Tomcat,配置Tomcat Web管理界面

一.Tomcat应用服务器 1.Tomcat介绍 Tomcat是- -个免费的开源的Ser Ivet容器&#xff0c;它是Apache基金会的Jakarta 项目中的一个核心项目&#xff0c;由Apache&#xff0c; Sun和其他一 些公司及个人共同开发而成。Tomcat是一一个小型的轻量级应用服务器&#xff0c;在中小型…

从零入手人工智能(5)—— 决策树

1.前言 在上一篇文章《从零入手人工智能&#xff08;4&#xff09;—— 逻辑回归》中讲述了逻辑回归这个分类算法&#xff0c;今天我们的主角是决策树。决策树和逻辑回归这两种算法都属于分类算法&#xff0c;以下是决策树和逻辑回归的相同点&#xff1a; 分类任务&#xff1…

[SAP ABAP] 排序内表数据

语法格式 整表排序 SORT <itab> [ASCENDING|DESCENDING]. 按指定字段排序 SORT <itab> BY f1 [ASCENDING|DESCENDING] f2 [ASCENDING|DESCENDING] ... fn [ASCENDING|DESCENDING].<itab>&#xff1a;代表内表 不指定排序方式则默认升序排序 示例1 结果显…

Nikto一键扫描Web服务器(KALI工具系列三十)

目录 1、KALI LINUX 简介 2、Nikto工具简介 3、信息收集 3.1 目标IP&#xff08;服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描特定端口 4.3 保存扫描结果 4.4 指定保存格式 4.5 连接尝试 4.6 仅扫描文件上传 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

抛弃Mybatis,拥抱新的ORM 框架!【送源码】

背景 转java后的几年时间里面一直在寻找一个类似.net的orm&#xff0c;不需要很特别的功能&#xff0c;仅希望90%的场景都可以通过强类型语法来编写符合直觉的sql&#xff0c;来操作数据库编写业务。 但是一直没有找到&#xff0c;Mybatis-Plus的单表让我在最初的时间段内看到…

告别繁琐邀请码,Xinstall助你轻松搭建高效App推广体系!

随着互联网流量的不断变迁&#xff0c;App推广和运营面临着前所未有的挑战。如何快速搭建起满足用户需求的运营体系&#xff0c;成为众多企业亟待解决的问题。在这个背景下&#xff0c;Xinstall凭借其强大的功能和灵活的解决方案&#xff0c;成为了App推广的得力助手。 一、传…

全面理解-Flutter(万字长文,深度解析)

1、Web 性能差&#xff0c;跟原生 App 存在肉眼可见的差距&#xff1b; 2、React Native 跟 Web 相比&#xff0c;支持的能力非常有限&#xff0c;特定长场景问题&#xff0c;需要三端团队一个一个处理&#xff1b; 3、Web 浏览器的安卓碎片化严重&#xff08;感谢 X5&#x…

Django 模版转义

1&#xff0c;模版转义的作用 Django模版系统默认会自动转义所有变量。这意味着&#xff0c;如果你在模版中输出一个变量&#xff0c;它的内容会被转义&#xff0c;以防止跨站脚本攻击&#xff08;XSS&#xff09;。例如&#xff0c;如果你的变量包含HTML标签&#xff0c;这些…

K8s部署高可用Jenkins

小伙伴们大家好呀&#xff01;断更了近一个月&#xff0c;XiXi去学习了一下K8s和Jenkins的相关技术。学习内容有些庞杂&#xff0c;近一个月的时间里我只学会了一些皮毛&#xff0c;更多的内容还需要后面不断学习&#xff0c;不断积累。最主要的是云主机真得很贵&#xff0c;为…

MySQL----利用Mycat配置读写分离

首先确保主从复制是正常的&#xff0c;具体步骤在MySQL----配置主从复制。MySQL----配置主从复制 环境 master(CtenOS7)&#xff1a;192.168.200.131 ----ifconfig查看->ens33->inetslave(win10)&#xff1a;192.168.207.52 ----ipconfig查看->无线局域网适配器 WLA…