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()
- STL--priority_queue
- STL【priority_queue】
- stl-priority_queue
- STL priority_queue
- STL Priority_Queue
- stl priority_queue
- stl priority_queue
- STL priority_queue
- STL priority_queue
- [STL]priority_queue
- STL-priority_queue
- STL-priority_queue
- STL Priority_queue
- 【STL】 priority_queue
- C++ STL priority_queue
- C++STL priority_queue 学习
- STL priority_queue使用
- STL容器适配器:priority_queue
- 结合apache和tomcat实现多域名、多端口绑定
- 检测当前鼠标点击的是UI的代码
- mysql---存储数据
- 英语学习总结—破枪式—学习困惑—2016年12月20日
- 毕向东笔记摘抄之多线程
- STL-priority_queue
- mysql 1215错误——外键建立失败
- JQ实现放大镜效果
- tensorflow学习笔记(二十一):tensorflow可视化
- JS 中的 真 与 假
- 浅谈<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- 安装第三方库出现 Python version 2.7 required, which was not found in the registry解决方法
- 使用VC++操作Excel文件 - [Ole]
- 微信硬件蓝牙jsapi开发之sendDataToWXDevice接口和onReceiveDataFromWXDevice接口(11)