数据结构篇——优先队列(堆)

本文详细介绍了优先队列的概念,重点讲解了二叉堆的定义和操作,包括插入、删除、降低值、增加值、删除及构建堆的过程。此外,还讨论了C++标准模板库中的`priority_queue`以及如何使用它来解决实际问题,例如UVA 11997题目的解决方案。
摘要由CSDN通过智能技术生成

目录

优先队列

二叉堆

堆定义:

堆操作

插入

删除(最小元)

降低值

增加值

删除

构建堆(将一个无序的二叉树变为堆)

标准模板库的priority_queue

优先队列的构造

成员函数

用到优先队列的例题

UVA 11997


优先队列

优先队列也是一种队列,具有高级别元素先出队的特征。优先队列的工作是找出、返回、删除最高级别元素。优先队列的实现普遍用二叉堆

二叉堆

二叉堆是一棵完全二叉树,每个节点必须小于等于它的孩子节点,二叉堆可以用一个一维数组表示,如下,左儿子的位置=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);
}

删除(最小元)

将堆中最后一个元素放在根节点,并且删除最后一个元素。选择左右子树中更小的一个,并且小于根节点,和根节点替换,逐步向下,直到没有替换的。举例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值