目录
优先队列
优先队列也是一种队列,具有高级别元素先出队的特征。优先队列的工作是找出、返回、删除最高级别元素。优先队列的实现普遍用二叉堆
二叉堆
二叉堆是一棵完全二叉树,每个节点必须小于等于它的孩子节点,二叉堆可以用一个一维数组表示,如下,左儿子的位置=2*父亲位置,右儿子的位置=2*父亲位置+1
下面左图为堆,右图不为堆,因为右图的6在5上方。
堆定义:
class BinaryHeap{
private:
int size;
vector<int> heap;
public:
BinaryHeap();
BinaryHeap(vector<int> v);
bool empty();
int & findMin();
void insert(int x);
void deleteMin();
void up(int pos);
void down(int pos);
void decreaseKey(int p,int n);
void increaseKey(int p,int n);
void remove(int p);
void buildheap();
};
堆操作
插入
当插入一个新的元素时,将其放在堆的最后,之后和其父节点对比,如果小于父节点,和父节点对调,反复执行直到不小于父节点。这个过程叫做上滤,一个节点一直向上直到找到自己的位置。举例:如下是插入14的过程
代码:
//上滤,从hole位置开始上滤
void BinaryHeap::up(int hole){
while(heap[hole/2]>heap[hole] && hole>1){
swap(heap[hole/2],heap[hole]);
hole = hole/2;
}
}
//插入
void BinaryHeap::insert(int x){
int hole = ++size;
heap.push_back(x);
up(hole);
}
删除(最小元)
将堆中最后一个元素放在根节点,并且删除最后一个元素。选择左右子树中更小的一个,并且小于根节点,和根节点替换,逐步向下,直到没有替换的。举例: