用字符“画”优先级先队(Priority Queue)。
优先级队列概念
普通的队列(Queue)是一种先进先出(FIFO)的数据结构,元素在队列尾追加,而从队列头删除。
优先级队列(Priority Queue)中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出(largest-in,first-out)的行为特征。
优先级队列有两种,一种是最大优先队列;一种是最小优先队列;每次取自队列的第一个元素分别是优先级最大和优先级最小的元素。
基于完全二叉堆
简单介始基于完全二叉堆的优先级队列,这里以最大优先队列为例。
优先级队列只需要最快的找到最大值(优先级最高),而不需要维护所有元素间的顺序;
(1)基本原理
如图所示:只需要保证完全二叉堆的根是最大值,其余只要保证堆序性;
完全二叉堆的节点数为n,则树高度h,可控制在O(log(n))。
堆序性:H[i] <= H[parent(i)],任一节点不大于父节点
15
/ \
13 10
/ \ / \
7 5 6 9
/ \ /
2 0 3
向量存储: 15, 13,10, 7,5,6,9, 2,0,3
向量下标: 0 , 1, 2, 3,4,5,6, 7,8,9
对于完全二叉堆的满元素层,第i+1层的节点数是第i层的两倍,
这是二叉堆实现索引父节点、子节点等计算的原理。
(2)父节点与子节点索引:
Parent(i) = (i-1) >> 1 /**< i的父节点(floor((i-1)/2),i无论正负) */
LeftChild(i) = 1 + (i<<1) /**< i的左孩子,即 (2*i+1) */
RightChild(i) = (1+i) << 1 /**< i的右孩子,即 (2*i+2) */
参考代码
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [ yehuohan@gmail.com ]