PriorityQueue类的使用及底层原理

目录

Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示

在这里插入图片描述
在这里插入图片描述
上面数组对应的完全二叉树是
在这里插入图片描述
从上面二叉树这个图中, 我们可以发现规律 :
如果一个节点对应的数组下标是index, 则我们可以计算出他的左节点的数组下标, 右节点的数组下标, 父节点的数组下标
左节点的数组下标 : index * 2 + 1
右节点的数组下标 : index * 2 + 2
父节点的数组下标 : (index - 1) / 2

因此我们可以简单的获取值的左右节点和父节点的值, 用于值与值间的对比, 替换

add()方法的底层原理 :

add()方法中调用的就是offer()方法, 直接看offer()方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

poll()方法的底层原理 :

在这里插入图片描述

PriorityQueue底层原理是基于优先堆(Priority Heap)的数据结构。优先堆是一种特殊的二叉树,它满足以下两个条件: 1. 任意节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。 2. 优先堆是完全二叉树,即除了最后一层,其他层的节点都被填满,最后一层的节点都集中在左侧。 PriorityQueue的内部使用数组来实现优先堆。数组的第一个元素是队列中的根节点,每个节点的子节点在数组中的位置可以通过一些计算公式快速得到。 当向PriorityQueue中添加元素时,元素会根据其优先级被插入到合适的位置上,并确保根节点的值最小(或最大,根据比较器的设定)。插入元素时,会根据比较器或默认的自然排序规则进行比较。 当从PriorityQueue中取出元素时,总是会先取出根节点的元素,该元素是队列中最小(或最大)的元素。取出后,会重新调整堆,确保根节点的值仍然最小(或最大)。 通过优先堆的特性,PriorityQueue可以高效地实现基于优先级的队列。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [PriorityQueue的用法和底层实现原理](https://blog.csdn.net/wr_java/article/details/116454654)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Java集合—PriorityQueue底层原理](https://blog.csdn.net/sanmi8276/article/details/113589290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值