堆
定义
堆是一种特别的完全二叉树,分为两种:大顶堆和小顶堆。
小顶堆(min heap):父节点的值恒小于等于子节点的值;
大顶堆(max heap):父节点的值恒大于等于子节点的值。
实现
由于堆本质上是一棵完全二叉树,通常是采用数组作为其存储结构,以数组作为其存储结构的好处是,我们可以通过下标索引的方式去访问节点的父节点和孩子节点。
对于堆中任意一个节点 i 有:
i的父节点:parent( i ) = floor( (i - 1) / 2 )
i的左孩子:left( i ) = 2 * i + 1
i的右孩子:right( i ) = 2 * i + 2
优先队列
通常采用堆数据结构来实现优先队列。
#include <functional> //包含greater和less两个优先级函数
#include <queue> //priority_queue的头文件
/*大顶堆*/
priority_queue<int, vector<int>, less<int>>pq_max;
/*小顶堆*/
priority_queue<int, vector<int>, greater<int>>pq_min;
/*优先队列的操作*/
pq.push(); //向队列中插入一个元素
pq.pop(); //删除堆顶的元素
pq.top(); //返回堆顶元素
pq.size(); //返回队列中的元素个数
pq.empty(); //判断队列是否为空
复杂度
insert(): O(log n)
remove(): O(log n)
search(): O(n)
buildHeap(array): O(n)
peek(): O(1)
Reference
https://www.jianshu.com/p/6b526aa481b1