java优先级队列

news2025/1/23 10:29:44

         1. 优先级队列

           1.1 概念 前面介绍过队列,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队 列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不合适,比如:在手机上玩游戏的时候,如 果有来电,那么系统应该优先处理打进来的电话;初中那会班主任排座位时可能会让成绩好的同学先挑座位。 在这种情况下,数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数 据结构就是优先级队列(Priority Queue)。

          2. 优先级队列的模拟实现 JDK1.8中的PriorityQueue底层使用了堆这种数据结构,而堆实际就是在完全二叉树的基础上进行了一些调整。 

          2.1 堆的概念 如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一 个一维数组中,并满足:Ki = K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为 小堆(或大 堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

堆的性质:

堆中某个节点的值总是不大于或不小于其父节点的值;

堆总是一棵完全二叉树

     大根堆示意图:

     

2.2 堆的存储方式 从堆的概念可知,堆是一棵完全二叉树,因此可以层序的规则采用顺序的方式来高效存储。

        

       由于我们可以通过结点之间的关系找到孩子节点和parent节点因此我们可以根据这个关系作为向下调整的依据。

 1. 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent如果有孩子一定先是有左孩子)

2. 如果parent的左孩子存在,即:child < size, 进行以下操作,直到parent的左孩子不存在 parent右孩子是否存在,存在找到左右孩子中最小的孩子,让child进行标 将parent与较小的孩子child比较,

如果: parent小于较小的孩子child,调整结束

否则:交换parent与较小的孩子child,交换完成之后,parent中大的元素向下移动,可能导致子 树不满足对的性质,

因此需要继续向下调整,即parent = child;child = parent*2+1; 然后继续2。

public void shiftDown(int[] array, int parent) {

int child = 2 * parent + 1;

int size = array.length;

while (child < size) {

if(child+1 < size && array[child+1] < array[child]){ 

child += 1;

}

if (array[parent] <= array[child]) {

break;

}else{

int t = array[parent];

array[parent] = array[child];

array[child] = t;

parent = child;

child = parent * 2 + 1;

    }

    }

}

注意:在调整以parent为根的二叉树时,必须要满足parent的左子树和右子树已经是堆了才可以向下调整。

时间复杂度分析: 最坏的情况即图示的情况,从根一路比较到叶子,比较的次数为完全二叉树的高度,即时间复杂度为 

   堆的删除:

  小根堆为例:如果删除第一个元素需首尾交换,后进行向下调整。当然如果删除最后一个节点只需容量-1即可。

   堆的插入:

    简单来说插入到最后一个然后向上查找即可完成目标 

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

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

相关文章

OpenSearch LLM智能问答版全新升级

阿里云OpenSearch LLM智能问答版是OpenSearch推出的一站式开箱即用的检索增强生成&#xff08;RAG&#xff09;云产品&#xff0c;帮助开发者快速构建多模态对话式搜索服务。 自2023年6月上线以来&#xff0c;OpenSearch LLM智能问答版已累计支持了数百家云上客户搭建RAG系统&…

人工智能|深度学习——YOLOV8结构图

YoloV8相对于YoloV5的改进点&#xff1a; Replace the C3 module with the C2f module.Replace the first 6x6 Conv with 3x3 Conv in the Backbone.Delete two Convs (No.10 and No.14 in the YOLOv5 config).Replace the first 1x1 Conv with 3x3 Conv in the Bottleneck.Use…

免费SSL证书签发安装指南

一、签发 1.选择证书颁发机构&#xff08;CA&#xff09;&#xff1a;首先&#xff0c;你需要找到一个提供免费SSL证书的CA。有些CA会提供永久免费的SSL证书&#xff0c;而有些则可能只提供有限时间的试用证书&#xff0c;如JoySSL就提供永久免费证书。 2.生成CSR&#xff08…

【面试干货】 两个有序数组的合并排序

【面试干货】 两个有序数组的合并排序 1、实现思想2、代码实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、实现思想 使用两个指针分别指向两个数组的起始位置&#xff0c;然后逐个比较两个指针所指向的元素&#xff0c;将较小的元素…

云原生 初识Kubernetes的理论基础

一、k8s 的由来及其技术运用 1.1 k8s的简介 Kubernetes&#xff0c;词根源于希腊语的 舵手、飞行员。在国内又称k8s&#xff08;因为k和s之间有8个字母&#xff0c;所以得名。“国内程序员的幽默”&#xff09;。 作用&#xff1a; 用于自动部署、扩展和管理“容器化&#x…

OpenAI发布会最新消息!ChatGPT新功能发布!

关于即将发布的内容&#xff0c;OpenAI 官方帖子提供的唯一细节是&#xff0c;此次发布将更新 ChatGPT 及其最新模型 GPT-4。 OpenAI 员工程博文&#xff08;Bowen Cheng&#xff09;跟了个帖&#xff0c;「比 gpt-5 更酷」&#xff0c;不过又迅速删帖。 OpenAI 的葫芦里到底卖…

C 深入指针(4)

目录 一、字符指针变量 1 初始化 2 与字符串数组的区别 二、数组指针变量 1 初始化 2 二维数组传参本质 三、函数指针变量 1 初始化 2 用法 四、typedef关键字 五、函数指针数组 一、字符指针变量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

前端 JS 经典:数组去重万能方法

前言&#xff1a;只需要掌握这一个方法&#xff0c;就可以对有任何重复的数据数组&#xff0c;进行去重了。 可以自己思考下&#xff0c;怎么对以下对象数组去重&#xff1a; const arr [{ a: 1, b: 2 },{ b: 2, a: 1 },{ a: 1, b: 2, c: { a: 1, b: 2 } },{ b: 2, a: 1, c:…

vue2 中使用audio播放音频

<audio controls ref"audioPlayer" style"width:800px;"><source :src"obj.audioUrl" /></audio> data() {return {obj: {audioUrl: require(../../../../public/audio/video.wav)}}}, 有个地方一定要注意一下. 如果不写req…

推荐丨免费的HTTPS证书在哪里可以申请?怎么申请?

当然&#xff0c;申请HTTPS证书的简化流程大致可以分为以下四个步骤&#xff1a; 1. 确定证书类型&#xff1a; - 首先&#xff0c;根据你的网站需求选择合适的HTTPS证书。常见类型包括&#xff1a;域名验证型&#xff08;DV&#xff09;、组织验证型&#xff08;OV&#xff09…

智慧校园是什么?如何定义?

智慧校园从边界上来说&#xff0c;是指以物联网为中心的智慧化的学校学习、日常生活一体化的环境&#xff0c;经过信息化手法将教育、教务办理和学校日子进行充沛交融&#xff0c;完结智慧化服务和办理的学校形式。 现在智慧校园已成未来趋势&#xff0c;我国的学校环境阅历了巨…

在springboot项目中自定义404页面

今天点击菜单的时候不小心点开了一个不存在的页面&#xff0c;然后看到浏览器给的一个默认的404页面 后端的程序员都觉得这页面太丑了&#xff0c;那么怎么能自定义404页面呢&#xff1f; 很简单&#xff0c;在我们的springboot的静态资源目录下创建一个error包&#xff0c;然…

氮气柜开门停止充氮、开门亮灯和超湿报警功能介绍

氮气柜是一种专门设计用于存储对湿度敏感的电子元器件、半导体材料、精密仪器、化学试剂等物品的设备&#xff0c;它通过注入高纯度氮气来降低内部湿度&#xff0c;以防止物品受潮或氧化。除基本功能外&#xff0c;沐渥科技新增了开门停止充氮、开门亮灯以及超湿报警这三个功能…

特征衍生-多变量交叉组合特征衍生

https://www.bilibili.com/video/BV1Kg411n7jv?p21&vd_source08e23da22e328e8950aeb24d2001d586

【AI绘画】Stable diffusion初级教程08——提示词(prompt)该如何写

今天是一篇干货&#xff0c;干的喝水的那种…… 写之前呢&#xff0c;先给大家打个比方&#xff1a;现在刚入门学习SD的相当于刚上学的小学生&#xff0c;提示词就相当于作文&#xff0c;还是英语作文&#xff0c;如果你总是抄抄抄&#xff0c;不知道作文的要点&#xff0c;语法…

笔记-Windows NFS → 中文乱码导致文件找不到

前提准备 项目中有这么一块业务 1、 脚本同步 这一环&#xff0c;是运维同事通过脚本实现的&#xff0c;所以我没去关注 2、 读取文件并上传 这一环&#xff0c;是我实现的&#xff0c;稳定运行了很长一段时间了&#xff0c;一直没出问题 中文乱码** 直到有一天&#xff0…

Typora + AliyunOSS + PicGo + OneDrive 搭建同步笔记本

文章目录 Typora AliyunOSS PicGo OneDrive 搭建同步笔记本1. 购置阿里云OSS资源2. 配置PicGo3. Typora oneDrive4. 注意 Typora AliyunOSS PicGo OneDrive 搭建同步笔记本 前记: 尝试使用Gitee和Github&#xff0c;效果都十分不理想 Gitee&#xff1a; repository仓库…

什么开放式耳机好用?2024五大爆款机型安利!

​2024年耳机的大热门毫无疑问的是开放式耳机&#xff0c;开放式耳机有着更健康的听音表现和极佳的佩戴舒适度&#xff0c;开放式设计在享受音乐的同时还可以清楚地听到外界的声音&#xff0c;这有助于在户外活动时保持对周围环境的警觉&#xff0c;增加使用时的安全性。作为一…

气膜体育馆的基础设施有哪些—轻空间

随着体育事业的迅速发展和全民健身意识的提升&#xff0c;现代体育场馆设施也在不断更新换代。新型气膜体育馆的出现&#xff0c;解决了传统体育场馆构建审核难、时间长、门槛高的问题&#xff0c;有利于构建多样化的体育场馆&#xff0c;提升人均体育场馆面积。 气膜建筑因其建…

医院内外网文件交互,关键在于安全、效率和便捷

目前&#xff0c;国内医院内外网隔离的网络建设已较为普遍&#xff0c;医院涉及大量患者信息、疾病研究、学术报告等资料&#xff0c;数据具有重要的价值&#xff0c;因此医院的内外网建设成为基本共识。 医院的内外网是相互对应而言的&#xff0c;一般来说&#xff0c;外网指医…