priority queue 本身是一个比较复杂的数据结构,这里记录一下刷题是遇到的常用语法。定义一个priority queue 是依附于某种数据类型及其container 和比较函数的(bool值函数。美东时间18年12月8日先更新,关于数据类型int 和 container vector 的声明以及复杂度。
1.声明
priority_queue<int, vector<int>, greater<int>> larger;
priority_queue<int, vector<int>, less<int>> smaller1;
priority_queue<int> smaller2;
这里称larger 叫大根堆(名字好奇怪。。。),位于队首的元素,是最小的元素。smaller1 和smaller2 叫小根堆,位于队首的元素,是最大的元素。(这里位于队首的元素,跟比较关系,正好是反着,就是这么任性)。其中smaller2 是C++的默认省略写法。
2.操作和复杂度。其中复杂度是与contained 本身heap 操作的复杂度有关。具体很复杂,我觉得死记硬背就好了
- empty: constant
- size: constant
- top: constant
- push: log(n)
- emplace: log(n)
- pop: log(n)
总的来说,就是有关队列性质的,都是constant,因为队列本身元素改变而需要重新维护一次队列的,都是log(n), 其中n为队列长度。
3.例题。LC295,find median from data stream
priority_queue[HTML_REMOVED], greater[HTML_REMOVED]> larger;这个不是叫做小顶堆吗?(小顶堆:最小堆,是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于其左子节点和右子节点的值。)
对,应该是小根堆
%%%
我最早接触 max heap ,就叫他“大顶堆”、“最大堆”,叫“大根堆”也是很皮了,嘻嘻嘻。
priority tree 应该叫 priority queue