当前位置: 首页 > news >正文

[java基础-集合篇]优先队列PriorityQueue结构与源码解析

优先队列PriorityQueue

优先级队列表示为平衡二进制堆

queue[n] 的两个子级是 queue[2*n+1] 和 queue[2*(n+1)]。

注:左子节点index=2*parentIndex+1,右子节点index=2*parentIndex+2,源码中计算parent位置时就是这样反过来计算的

优先级队列按 comparator 排序,如果 comparator 为 null,则按元素的自然排序排序:对于堆中的每个节点 n 和 n 的每个后代 d,n

PriorityQueue 是一个基于优先级堆的无界优先级队列实现,它可以确保每次出队的元素都是队列中优先级最高(最小的)的元素。

PriorityQueue结构

PriorityQueue结构上是一个基于数组的“完全二叉树”,且“任意节点的值<=子节点的值”,是一个“小顶堆”。

完全二叉树:除最底层节点,其他层都是满的,并且最后一层的所有节点尽可能地靠左排列

PriorityQueue方法

add(E e)

实质是offer(E e)方法,元素首先被添加到数组末尾,然后通过siftUp方法向上调整位置以维持堆的性质

扩容grow(int minCapacity)

peek

取第一个元素

poll

取出第一个元素并删除。移除队列头部元素(即最小元素)时,会将数组最后一个元素移动到头部,然后通过siftDown方法向下调整位置以恢复堆的性质

两个方法和上浮方法一样,只是比较方式不同

PriorityQueue特点

不允许元素为null,无添加顺序(不会按照添加顺序来),自然顺序,线程不安全

使用位移运算代替乘除、提升运算效率。

PriorityQueue资料引用(推荐)

Java【优先级队列】详细图解 / 模拟实现 + 【PriorityQueue】常用方法介绍_java优先队列-CSDN博客

http://www.lryc.cn/news/519040.html

相关文章:

  • 12. C语言 数组与指针(深入理解)
  • Postman接口测试基本操作
  • MySQL--2.1MySQL的六种日志文件
  • spring task使用
  • 【FPGA】时序约束与分析
  • LLM的MoE由什么构成:门控网络,专家网络
  • HTML-多媒体标签
  • MySQL笔记大总结20250108
  • stm32week3
  • uniapp 的uni.getRecorderManager() 录音功能小记
  • 【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法
  • RT-DETR代码详解(官方pytorch版)——参数配置(1)
  • 腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器
  • 搭建docker私有化仓库Harbor
  • 【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)
  • GIC中断分组介绍(IMX6ull为例)
  • 计算机网络期末复习(知识点)
  • Apache XMLBeans 一个强大的 XML 数据处理框架
  • 飞凌嵌入式i.MX8M Mini核心板已支持Linux6.1
  • 【数据链电台】洛克希德·马丁(Lockheed Martin)
  • python关键字(保留字)用法、保留的标识符类(1)
  • Ubuntu平台虚拟机软件学习笔记
  • 【数据库系统概论】数据库恢复技术
  • R 语言科研绘图 --- 折线图-汇总
  • 基于 Python 和 OpenCV 的人脸识别上课考勤管理系统
  • 工业 4G 路由器赋能远程医疗,守护生命线
  • Windows安装Ubuntu子系统图形化工具
  • MiniMind - 从0训练语言模型
  • sql正则表达
  • 基于华为Maas(大模型即服务)和开源的Agent三方框架构建AI聊天助手实践