PriorityQueue的BinaryHeap实现

PriorityQueue(优先队列)有很多应用场景,例如去听一场音乐会,假如票已经都卖完了,但是还有许多没票的人在排队等是否有人退票,如果有人退票,那么系统就需要把这张票分类给优先级最高的那个排队者(这里的优先级可以是排队的时间,或者交的钱多少等,这里的优先级条件对应priorityqueue中的key)。

PriorityQueue的实现方法有多种,包括SortedList,UnSortedList以及BinaryHeap。其核心操作为insert()与removeMin(),BinaryHeap看似实现比其他两种复杂,但是在这两种核心操作的效率上却优于另外两个。

下面介绍一下BinaryHeap,BinaryHeap就是一种特殊的complete binary tree(完全二叉树),它的每个节点的key值要大于它的父亲节点。所以最小的节点永远是根节点。又由于它是一棵完全二叉树,因此用一维数组来实现。数组的下标能够映射出节点间的父子关系,其中节点i的父节点的下标为floor(i / 2), i的左右孩子节点分别为2i与2i+1。为了映射出这种关系,在实现一维数组的时候数组的第一个元素为空,因为下标0将打破这种映射关系。元素按层次遍历顺序存储在数组中,如下图的一个BinaryHeap的存储:


对于核心操作removeMin(),因为根节点是最小的节点,因此每次都是remove根节点,根节点remove后我们把二叉树的最后一个叶子节点(上图的节点8)放在根节点的位置,放完后为了保持前面提到的二叉树的节点顺序属性,我们将该跟节点与它的左右孩子节点比较,如果它大于其中任何一个或者两个,将它与最小的那个做位置交换,然后继续该比较,直到该节点找到它的合适位置(小于它的子节点或者已经是叶子节点),这样操作后二叉树又保持了原有的属性。如下图:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值