学习算法——优先队列

//新人正在学习算法 第一次发文章记录下学习之旅

//第一次更新 了解尚浅 欢迎大佬补充

一、基本概念

优先队列可拿出优先级最高的元素

优先队列的数据结构是堆,本质上一种完全二叉树,默认是大顶堆

//大顶堆        每一个结点的关键字都不小于其孩子结点

二、基本操作

//使用之前需导入库函数        #include<queue>

再导入库函数之后 使用之前需进行定义:
        priority_queue<typename,container,functional>        que;

  • typename:数据类型
  • container:容器类型 写作vector<typename>
  • functional:比较方式,默认大顶堆   greater<typename>表示小顶堆  升序输出  less<typename>表示大顶堆  降序输出

优先队列的常用操作有5个:

  • que.size()        无参数 有返回值 返回堆内元素数量
  • que.push(x)     有参数x 无返回值 表示向堆中插入x
  • que.pop()         无参数 无返回值 删除堆顶元素
  • que.top()          无参数 有返回值 返回当前堆顶元素
  • que.empty()     无参数 有返回值(布尔类型) 判断堆是否为空

 三、进阶 对于自定义类型数据使用

struct node{

        int x;

        int y;

};

对于自定义结构类型,不能简单加入

例如:

        priority_queue<node> que;        程序出错,程序无法识别自定义数据类型的比较方式

两种方法解决:1、在自定义的数据类型中重载运算符        2、在定义优先队列时加入比较方式

本文章目前只介绍第一种(因为第二种没了解)

struct node{

        int x;

        int y;

        bool operator < (const node & a) const {
                return x<a.x;

        }

        node(int xx=0,int yy=0):x(xx),y(yy){}        

};

node a(4,6);

node b(7,8);

node c(1,3);

priority_queue<node> que;

que.push(a);

que.push(b);

que.push(c);

这样就将a,b,c三个数据放入到优先队列里

利用cout<<que.top().x;        que.pop()将得到输出为 7(b) 4(a) 1(c)

在此说明下比较方式:

首先优先队列为空,对于a,b元素的放入,利用自定义的比较方式 可以理解为 首先是 a<b 其中a、b是自定义数据类型 将利用相应的x值进行比较 即a.x<b.x 在上方例子中a.x=4 b.x=7 为此4<7 返回true即a<b为真

则判断b的优先级比a高 此时b处于堆顶位置 后续放入c也是同理 

若想要输出 1(c) 4(a) 7(b)        只需改为return x>a.x;即可

//第一次更新到此 下次再见 2023/4/2

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值