JAVA并发编程: PriorityQueue -》阻塞队列 PriorityBlockingQueue

生活

一旦一种新技术开始滚动碾压道路,如果你不能成为压路机的一部分,那么你就只能成为道路的一部分。

PriorityQueue

阻塞队列里的PriorityBlockingQueue基于PriorityQueue,所以在研究PriorityBlockingQueue之前要先研究一下PriorityQueue,这是一个有优先级概念的队列,是有顺序的,他的顺序是通过内部的比较器实现。
他的内部维护了一个数组,但不是一个简单的数组,其实是通过一个数组,维护一个二叉堆的数据结构。
因此先把二叉堆搞清楚。

啥是二叉堆

研究二叉堆,有必要先把堆的概念搞清楚,注意:这里指代的堆,并不是java开发中常说的堆栈的那个堆哦。
那么,堆是一种怎么样的数据结构呢?
堆通常是一个可以看成一棵树的数组对象,有以下两个特征:
1、堆的某个节点,总是不大于或者不小于父节点
2、堆是一颗完全树。

二叉堆是一种特殊的堆,二叉树是一颗完全二叉树或者近似于完全二叉树。
二叉堆又有两种,最大堆和最小堆。
最大堆:父节点总是大于等于任何一个子节点
最小堆:父节点总是小于等于任何一个子节点。

来图解表示下二叉堆

在这里插入图片描述

上图是一个二叉堆(完全二叉树),他的特点是在N层被填满之前,不会开始第N+1层的填充,并且填充的顺序是从左往右。
二叉堆又可以用数组来表示:
如下图
在这里插入图片描述
通过上图可以发现一个规律,使用数组实现的二叉堆,位置N上的元素,其左孩子在2N+1处,其右孩子在2N+2处,根节点是0。

由于ProtityQueue是一个有优先级概念的队列,因此可以使用二叉堆来实现,队列的入队和出队,也可以通过二叉堆来实现,对应到二叉堆就是他的上移和下移,下面来图解一下 二叉堆的上移和下移。

这些图都是盗来的。。自己绘画水平太差了~~

二叉堆的上移

下面图解描述一下如何向二叉堆添加一个元素:
在这里插入图片描述
图1是一个二叉堆 最小堆(完全二叉树)
图2在二叉树的最后插入一个节点2
在这里插入图片描述
图3 由于图2中2的父节点6比它大,所以2和6交换
图4 由于2的父节点5比它,所以2和5交换,
此时又是一个标准的二叉堆。

二叉堆的下移

下面来看下如何把二叉堆中第一个元素移出,即优先队列中的出队操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值