字符画之画优先级队列

  1. 优先级队列概念
  2. 基于完全二叉堆
  3. 参考代码

用字符“画”优先级先队(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 ]

文章标题:字符画之画优先级队列

本文作者:Y

发布时间:2018-07-14, 01:20:36

最后更新:2019-05-21, 20:44:46

原始链接:http://yehuohan.github.io/2018/07/14/%E7%AC%94%E8%AE%B0/DSA/%E5%AD%97%E7%AC%A6%E7%94%BB%E4%B9%8B%E7%94%BB%E4%BC%98%E5%85%88%E7%BA%A7%E9%98%9F%E5%88%97/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。