Java优先级队列PriorityQueue

概述

        优先级队列PriorityQueue是队列接口Queue的一种实现,能够以O(logn)的时间复杂度实现元素的插入和删除。PriorityQueue不是一个标准的队列,因为它保存元素的顺序不是按照元素入队的顺序,而一个是按元素的大小重新排序的,这已经违反了队列先进先出(FIFO)的基本规则。PriorityQueue是一种具有特殊用途的数据结构,它总能保持队首元素是队列中最大的,这个特性使得PriorityQueue在需要基于优先级处理任务的场景下非常有用,比如在调度算法、事件驱动编程、优先级排序等应用中。

        想要每次都能从队列中获取最大元素通常能想到的方式有两种:比如元素无序保存,出队时遍历一遍队列找出最大元素,这种方式元素入队的时间复杂度为O(1),出队的时间复杂度为O(n);或者是元素按顺序保存,出队时直接取队首元素,这种方式元素入队的时间复杂度为O(n),出队的时间复杂度为O(1);由于这两种方式都不能兼顾元素入队出队的效率,于是便有了基于二叉堆的实现方式。

完全二叉堆

        PriorityQueue内部实现通常采用堆数据结构,具体来说,是一个完全二叉堆,它在结构上是完全二叉树的形式,也就是说,除了最后一层可能不满外,每一层都是完全填充的,且最后一层的所有结点都尽可能地靠左排列。完全二叉堆分为两种类型:最大堆和最小堆。

最大堆:在最大堆中,每个父节点的值都大于或等于其子节点的值。因此,堆的根节点总是包含堆中的最大值。

最小堆:在最小堆中,每个父节点的值都小于或等于其子节点的值。所以,堆的根节点存储的是堆中的最小值。

        完全二叉堆主要操作包括元素插入和删除:插入的新元素总是被添加到完全二叉树的最后一层的最右侧的空位置,然后通过上滤(swim)过程调整堆,以维护堆的性质。删除操作通常涉及移除堆顶元素,然后将堆的最后一个元素移动到堆顶位置填补空缺,并通过下滤(sink)过程调整堆。完全二叉堆由于其高效的特性(插入和删除O(logn)时间复杂度),常被用于实现优先队列等数据结构和各种算法中,比如堆排序、TopN问题等。堆的详细介绍请参考数据结构:堆

优先级队列的使用

PriorityQueue简单示例:
// 创建一个空的优先级队列
PriorityQueue<Integer> queue = new PriorityQueue<>();
// 添加元素
queue.offer(5);
queue.offer(3);
queue.offer(7);
queue.offer(1);
// 元素出队
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());

输出为1、3、5、7。元素插入是无序的,输出按从小到大排序,可见这是一个最小堆实现的优先队列,也可以通过向构造器传入参数实现降序排序。

定制排序:
// 创建一个空的优先级队列并传入排序规则
PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.reverseOrder());
// 添加元素
queue.offer(5);
queue.offer(3);
queue.offer(7);
queue.offer(1);
// 元素出队
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
//输出为7、5、3、1
使用集合初始化优先队列:
//创建一个优先级队列并使用List初始化
PriorityQueue<Integer> queue1 = new PriorityQueue<>(Arrays.asList(3,1,7,5));
//创建一个优先级队列并使用另一个队列初始化
PriorityQueue<Integer> queue2 = new PriorityQueue<>(queue1);
//创建一个优先级队列并使用set集合初始化
Set<Integer> set = new HashSet<>();
PriorityQueue<Integer> queue3 = new PriorityQueue<>(set);

Java标准库中实现了多种PriorityQueue的构造器,能够通过不同类型的集合快速地生成一个优先级队列,为程序员提供了便利,提升了应用开发的灵活性。

总结

PriorityQueue不遵循传统队列的FIFO原则,作为一种特殊的队列类型,它通过动态调整元素顺序,高效地支持了基于优先级的操作,是解决特定类型问题的强大工具。

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

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

相关文章

Postman如何测试WebSocket接口!

01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直…

rpm方式安装Mysql报错依赖冲突解决

使用rpm安装mysql时在安装到client包时报错依赖库冲突以及GPG密钥问题&#xff0c; 解决 1&#xff0c;下载 MySQL 的 YUM 存储库文件。 wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 2&#xff0c;安装下载的 YUM 存储库文件。 sudo rpm -…

Excel lookup函数使用方法及案例说明

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f50d; 在Excel中&#xff0c;LOOKUP函数是一个强大的工具&#xff0c;用于查找和返回数据。无论是从一列中查找对应的值&#xff0c;还是在数据表中进行复杂的查找&#xff0c;LOOKUP函数都能帮助我们快速找到所需的…

VScode 修改 cursor 键盘设置

vscode 中按下 ctrl K 后 ctrl s 打开键盘快捷键设置。 搜索光标 cursor 找到 cursorDown 以及对应需要修改的快捷键命令 右键 添加快捷键设置 修改即可 alt space 关闭win设置中的中英文切换 代码提示下移 selectPrevSuggestion 上移

电脑usb控制软件有哪些?6款软件帮你轻松解决USB端口泄密烦恼!

在数字化时代&#xff0c;企业的信息安全成为重中之重。 然而&#xff0c;USB端口泄密事件频发&#xff0c;给企业的数据安全和业务连续性带来了巨大威胁。 此前&#xff0c;某大型制造企业&#xff0c;由于员工在日常工作中频繁使用U盘等USB存储设备&#xff0c;导致公司核心…

推荐五种msvcr71.dll丢失的解决方法,msvcr71.dll为什么会丢失?

当你的电脑提示msvcr71.dll丢失时是什么情况&#xff1f;为什么会出现这样的问题&#xff1f;msvcr71.dll丢失和什么有关呢&#xff1f;那么msvcr71.dll丢失应该如何解决呢&#xff1f;今天就和大家聊聊msvcr71.dll丢失的解决办法的详细解决步骤。 msvcr71.dll丢失是否与系统更…

在 Windows 上安装 Python

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

Nexus3的妙用

nexus 3使用场景 Nexus是一个全能仓库,通过部署nexus可以实现包含yum、apt、Maven、pypi、docker等的多种仓库。以下是nexus的适用场景: 当公共仓库无法访问或缓慢时,搭建nexus。比如国内docker无法访问,需要镜像加速。可以使用海外主机部署nexus,在nexus中创建docker(p…

redis安装(以6.0.13为例)

redis-6.0.13安装 1.创建安装目录2. 上传安装包3. 替换repo文件4.依赖安装5. redis安装5.1 解压5.2 编译5.3 安装5.4 配置 6. 常用命令 1.创建安装目录 mkdir -p /apps/scripts/ cd /apps/scripts/2. 上传安装包 将redis-6.0.13.tar.gz 上传至/apps/scripts/目录下 下载链接…

在泰国旅游不会口语怎么办?求推荐翻译软件!!!

如果在泰国旅游时遇到语言障碍&#xff0c;可以采取以下措施&#xff1a;学习一些基础的泰语短语&#xff0c;使用翻译应用程序&#xff0c;携带翻译卡片&#xff0c;利用身体语言&#xff0c;参加有导游的旅行团&#xff0c;选择提供中文服务的酒店和旅行社&#xff0c;使用地…

xtop:multi_driven_net与incomplete_timing_cell fail reason 分析

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 xtop做时序收敛时报告fail reason&#x

【技术实操】银河麒麟操作系统安装Node.js运行环境及其进程管理

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 前言 Node.js作为一个开源、跨平台的JavaScrip…

智能BI项目第五期

本期主要内容 系统问题分析异步化业务流程分析线程池讲解&#xff08;入门 原理 实战&#xff09;系统异步化改造开发 1.系统问题分析 当系统面临大量用户请求时&#xff0c;我们后端的 AI 处理能力有限&#xff0c;例如服务器的内存、CPU、网络带宽等资源有限&#xff0c…

前端web端项目运行的时候没有ip访问地址

我们发现 没有netWork 的地址 导致 团队内其他同学无法打开我们的地址 进行访问 在page.json 中的运行 指令中 添加 --host 记得加上空格 这样我们就可以看到这个地址了 团队其他同学 就可以访问我们这个地址了

Nuxt Kit 中的模板处理

title: Nuxt Kit 中的模板处理 date: 2024/9/20 updated: 2024/9/20 author: cmdragon excerpt: 摘要:本文详细介绍了在Nuxt 3框架中,使用Nuxt Kit进行模板处理的方法,包括理解模板基本概念、使用addTemplate动态生成文件、应用addTypeTemplate注册类型模板以增强TypeScr…

spring boot启动报错:so that it conforms to the canonical names requirements

springboot 2.x的版本中对配置文件中的命名规范有了强制性的要求&#xff0c;如下图所示中的dataSource属性属于驼峰格式&#xff0c;但是在springboot 2.x中不允许使用驼峰形式。 根据错误提示可知将其使用 - 来分割即可 错误信息的含义&#xff1a;“Canonical names should…

这年头找工作岗位都能开盲盒了??能给我开个 CEO 当当吗?

大家好&#xff0c;我是鸭鸭&#xff01; 求职季总是让人啼笑皆非&#xff0c;各种骚操作让鸭鸭吃瓜到嘴软。这不&#xff0c;鸭鸭最近就瞅到了一个让人啧啧称奇的“岗位盲盒”。 哎哟喂&#xff01;鸭鸭现在才知道&#xff0c;连找工作都能开盲盒&#xff0c;是我见识短了吗…

你是不是分不清哪些字体是商用,哪些非商用?快来看,免得莫名其妙负债。

前言 最近发现有好多小伙伴在做PPT的时候&#xff0c;都有一个很不好的习惯&#xff1a;没有调整好字体。 这里说的没有调整好字体的意思是&#xff1a;在一些公开发布的内容上使用一些可能造成侵权的字体。 字体侵权‌的后果相当严重。轻者可能面临法律纠纷&#xff0c;重者…

基于YOLOv8/YOLOv9/YOLOv10的河道漂浮物检测识别系统

摘要&#xff1a; 河道漂浮物检测识别是指利用技术手段自动识别河流、湖泊等水体表面的漂浮垃圾或物体的过程。随着环境保护意识的增强和技术的进步&#xff0c;河道漂浮物检测已经成为水环境保护和管理的重要组成部分。这项技术的应用可以帮助及时发现污染源&#xff0c;采取措…

响应式监听localStorage存储?封装个自定义Hook不就好了!

背景 项目上有个更改时区的全局组件&#xff0c;同时还有一个可以更改时区的局部组件&#xff0c;想让更改时区的时候能联动起来&#xff0c;实时响应起来。 其实每次设置完时区的数据之后是存在了前端的 localStorage 里边&#xff0c;时&#xfffd;&#xfffd;&#xfff…