Java优先队列 学后杂记

本文探讨了优先队列的实现方式,重点讲解了如何利用最小堆进行数据存储,并详细介绍了基于数组实现的增删改查操作及其背后的算法原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//本人菜鸟  如有错误求指出

实现优先队列 首先需要解决存储问题   链式存储结构?顺序存储结构? 由于优先队列默认使用最小堆实现  即  根结点值小于其叶子节点值  。也是一种完全二叉树 在顺序存储时 其根结点 与其对应的孩子节点有特定的 下标关系   采用数组存储数据  当父结点下标(从0开始)为 i时 其左孩子下标为2*i+1  右孩子为2*i+2。这样解决了优先队列数据存储问题。

接下来  集合中方法实现 主要涉及 增删改查   使用数组存储时还要考虑到数组自动扩容

jdk中  一共有6个量  size记录 当前元素个数   modcount记录存储更改次数 防止 多线程同步问题  Object[] queue 存储元素

DEFAULT_INITIAL_CAPACITY 存储  默认的初始化空间 Comparator<? super E> comparator 存储 自定义的比较器

MAX_ARRAY_SIZE存储用于数组扩容时    数组容量已经比较大时的 辅助处理值?

主要核心有以下方法: 

加入队列  如队列中元素为0  直接加入堆顶  否则 调用上浮函数 从队列尾部  将当前元素加入堆中合适位置、

出队列  如队列中元素为1个 则直接出队列  否则 调用下浮函数 从队列头部 将队列尾部元素加入到队列中合适位置

加入队列时需要考虑扩容问题    如容量不足 需要扩容

扩容实现    当当前容量极小时  每次扩容为原来的两倍+2   否则 扩容为原容量的1.5倍  如新容量已经大于 MAX_ARRAY_SIZE 则调用hugeCapacity方法 根据minCapacity与 MAX_ARRAY_SIZE的关系 将新容量设置为 MAX_ARRAY_SIZE 或Integer.MAX_VALUE  调用 Arrays.copyof()方法  实现数组扩容及保存原数组元素

增删已经完毕  还有  改查

indexOf  为null 或不存在指定元素 返回 -1  否则返回数组中的下标

contains方法调用 indexof方法实现 

remove  删除优先队列中位置靠前的指定元素 先indexOf   合法  调用 remove(int i) 在第二个remove中 取出队列尾部元素  将对位元素在该位置 先 下浮  如未沉下去  再将其上浮

peek  返回队列头部元素  直接返回 queue【0】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值