STL-priority_queue

来源:互联网 发布:linux编辑文件不保存 编辑:程序博客网 时间:2024/05/11 13:08

priority_queue概述

  priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能。由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素,除此之外别无其它存取元素的途径。
  priority_queue带有权值观念,其内的元素是自动按照元素的权值排列(通常权值以实值表示)。权值最高者,排在最前面。
  缺省情况下priority_queue系利用一个max-heap完成,后者是一个以vector表现的complete binary tree。
  这里写图片描述

heap

  heap是以算法的形式呈现,并不属于STL容器组件,是作为priority queue的助手。
  binary heap是一种complete binary tree,也就是说,整颗二叉树除了最底层的叶节点之外,是填满的,而最底层的叶节点由左至右又不得有空隙。如下图所示:
  这里写图片描述
  因为完全二叉树没有任何节点漏洞,我们可以用vector来储存所有节点,将vector的#0元素保留,那么完全二叉树的某个节点位于vector的i处时,其左子节点必位于vector的2i处,其右子节点必位于vector的2i+1处,其父节点必位于i/2处。
  这样我们只需要一个vector和一组heap算法(用来插入元素、删除元素、取极值、将一整组数据排列成一个heap)。
  根据元素排列方式,heap可分为max-heap和min-heap两种。 

  • max-heap:每个节点的键值key都大于等于其子节点键值
  • min-heap:每个节点的键值key都小于等于其子节点键值
      下面以max-heap为例:

    push_heap算法

      为了满足完全二叉树的条件,新加入的元素放在放在最下一层作为叶节点,并填补第一个空格,即vector的end()处。
      这里写图片描述
    为了满足max-heap的条件(每个节点的键值都大于或等于其子节点键值),所以我们将新节点与父节点比较,如果其键值key大于父节点,就交换位置,即所谓的上溯程序,如此一直上溯,直到不需要对换或直到根节点为止。

pop_heap算法

  max-heap的最大值必然在根节点。pop操作取走根节点(即vector的尾端节点)后,为了满足完全二叉树的条件,必须割舍最下层最右边的叶节点,并将其值重新安插至max-heap(因此有必要重新调整heap结构)。
这里写图片描述
  为了满足max-heap次序特性(每个节点的键值都大于等于其子节点键值),将空间节点和其较大子节点”对调”,并持续下放,直至叶节点为止。然后将前述被割舍之元素值设给这个”已到达叶层的空洞节点”,再对它执行一次上溯程序。
  pop_heap之后,最大元素只是被置放于底部容器的最尾端,尚未被取走。如果要取其值,可以用vector所提供的back()操作函数。如果要移除它,可使用pop_back()操作函数。

sort_heap算法

  因为每次pop_heap可获得heap中键值最大的元素,如果持续对整个heap做pop_heap()操作,每次操作范围从后向前缩减一个元素(因为pop_heap会把键值最大的元素放在底部容器的最尾端),当整个程序执行完毕时,我们便有了一个递增序列。

priority_queue定义

  priority_queue完全以底部容器为根据,再加上heap处理规则,缺省情况下是以vector为底部容器。

priority_queue构造

class T{    ...;};priority_queue<T,vector<T>,greater<T>> max_heap;priority_queue<T,vector<T>,less<T>> min_heap;

priority_queue没有迭代器

priority_queue的所有元素,进出都有一定规则,只有queue顶端的元素(权值最高者),才有机会被外界取用。priority_queue不提供遍历功能,也不提供迭代器。

priority_queue操作

empty()size()top()pop()push()
0 0
原创粉丝点击