优先级对列priority_queue

priority_queue:优先级队列(本质就是堆)

堆:完全二叉树+条件:任意节点都要比其孩子节点小(大)----》小堆(大堆)

1.包含<queue>头文件+std

2.底层就是堆

3.模板参数列表说明:

构建: 

#include<iostream>

using namespace std;

#include<queue>
#include<functional>

int main()
{
	priority_queue<int > q;   //默认创建的大堆

	priority_queue<int, vector<int>, greater<int>>q1;  //建小堆

	//区间方式构建
	int array[] = { 5, 9, 2, 1, 0, 4, 6, 3, 4, 7 };
	priority_queue<int> q2(array, array + sizeof(array) / sizeof(array[0]));


	vector<int> v{ 5, 9, 2, 1, 8, 3, 7, 4, 0, 6 };
	priority_queue<int> q(v.begin(), v.end());
}

关于比较方式:

1.如果优先级队列中放的是内置类型元素,比如:int,double等,直接使用STL提供less和greater类模板来比较即可。

注意: less是按照小于方式比较     greater是按照大于方式比较

使用less和greater的时候,需要包含<functional>头文件  指针除外

2.如果优先级队列中方式的是自定义类型的元素,需要用户自己提供元素和元素的比较方式 less和greater不能比较自定义类型的元素

方式一:可以在类中自己根据需要重载 <或者>

 方式二:函数 指针

 方式三:借助仿函数(仿函数 可以向函数一样调用对象成为函数对象)

实现方式:在类中只需要将函数调用运算符重载即可---->所谓的函数调用运算符就是()

 top-K:在一个数据集中找前k个最大或最小的元素

解决top-k问题最佳的方式就是使用堆(优先级队列)

方式:

1.先利用前k个元素建堆

注意:前k个最大的元素------>创建小堆  前k个最小的元素 ---->创建大堆

2.用剩余的N-k个元素依次和堆顶元素比较,如果大于堆顶的元素则替换(找前k个最大的元素)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值