[cpp--->优先级队列]
文章目录
- @[TOC](文章目录)
- 一、优先级队列模拟实现
- 1.实现思想
- 2.代码实现
- 二、实战应用
- 1.[数组中第K个最大元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/)
- 2.日期类的比较
一、优先级队列模拟实现
1.实现思想
优先级队列内部结构是堆,因为堆是尾插和尾删,所以堆是用vector作为适配器的基础上实现的.堆的核心实现就是向上和向下调整.堆有大堆和小堆,大堆小堆是用child节点和parent节点的比较方法确定的,所以优先级队列还增加了用于比较的模板参数,可以穿参比较函数指针,也可以是仿函数;仿函数stl库#include中有实现好的greater和less模板仿函数类可用使用.
2.代码实现
#pragma once
#include<iostream>
#include<vector>
#include<functional>
#include<assert.h>
using namespace std;
namespace kxj
{template <class T,class container=vector<T>,class compare=less<T>>class priority_queue{public:void adjustUp(int child){//确定父节点int parent = (child - 1) / 2;//孩子等于0parent就会越界while (child > 0){//调换child和parent在仿函数形参中的位置比较结果会发生翻转if (compare()(_con[child] , _con[parent])){//交换swap(_con[child], _con[parent]);//更新parent和childchild = parent;parent = (child - 1) / 2;}else{//不满足条件就跳出break;}}}void adjustDown(int parent){//确定孩子节点int child = parent * 2 + 1;//用parent作为条件也可while (child < _con.size()){//找到最大的孩子节点与父节点比较child = child + 1 < _con.size() && compare()(_con[child + 1], _con[child]) ? child+1 : child;if (compare()(_con[child], _con[parent])){swap(_con[parent], _con[child]);parent = child;child = parent * 2 + 1;}else{break;}}}void push(const T& val){//先插入再从下往上调整_con.push_back(val);adjustUp(_con.size()-1);}void pop(){//先头尾交换,再删除,因为头是最大或者最小的看,然后再自上而下调整swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjustDown(0);}//堆顶T& top(){return _con.front();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:container _con;};void test_priority_queue(){kxj::priority_queue<int> pq;pq.push(1);pq.push(6);pq.push(3);pq.push(7);pq.push(9);pq.push(2);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;}
}
二、实战应用
1.数组中第K个最大元素
用数组的前k个元素建小堆,然后从数组k的位置与堆顶比较,大于堆顶则入堆,最后堆顶就是第k大的元素.
class Solution {public:int findKthLargest(vector<int>& nums, int k) {priority_queue<int,vector<int>,greater<int>> q;for(int i=0;i<k;i++){q.push(nums[i]);}for(int i=k;i<nums.size();i++){if(nums[i]>q.top()){q.pop();q.push(nums[i]);}}return q.top();}
};
2.日期类的比较
因为日期类重载了比较符号所以直接比较日期类对象不会有什么问题,但是如果比较日期类的地址还想保持日期的排序正确,就必须自定义比较仿函数,让内部比较的是日期地址的解引用以后得值.
class Date{public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}bool operator<(const Date& d)const{return (_year < d._year) ||(_year == d._year && _month < d._month) ||(_year == d._year && _month == d._month && _day < d._day);}bool operator>(const Date& d)const{return (_year > d._year) ||(_year == d._year && _month > d._month) ||(_year == d._year && _month == d._month && _day > d._day);}friend ostream& operator<<(ostream& _cout, const Date& d){_cout << d._year << "-" << d._month << "-" << d._day;return _cout;}private:int _year;int _month;int _day;};struct DateLess{bool operator()(Date* d1,Date* d2){return *d1 < *d2;}};struct DateGreater{bool operator()(Date* d1, Date* d2){return *d1 > *d2;}};//比较日期类的指针void test_priority_queue3(){kxj::priority_queue<Date*, vector<Date*>, DateGreater> q;q.push(new Date(2023, 3, 3));q.push(new Date(2023, 3, 5));q.push(new Date(2023, 4, 5));while (!q.empty()){cout << *(q.top()) << endl;q.pop();}cout << endl;}
[cpp--->优先级队列]相关推荐
- 【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )
文章目录 queue 队列 stack 栈 priority_queue 优先级队列 priority_queue 优先级队列指定排序方法 priority_queue 优先级队列排序行为 prior ...
- 【STL学习】优先级队列Priority Queue详解与C++编程实现
优先级队列Priority Queue介绍 优先级队列是一个拥有权值观念的queue.它允许在底端添加元素.在顶端去除元素.删除元素. 优先级队列内部的元素并不是按照添加的顺序排列,而是自动依照元素的 ...
- C++数据结构与算法(九) 树,优先级队列,最大堆的实现
树: 用来表示具有结构层次的数据,应用: 软件工程技术:模块化技术 根: 子树: 在树中,每个元素都代表一个节点. 树的级: 根是一级,根的孩子是二级,一次往下,有三级,四级... 树的高度(深度): ...
- (P85)stl(十三):容器适配器,stack,queue,优先级队列priority_queue,make_heap
文章目录 1.容器适配器 2.stack 3.queue 4.优先级队列priority_queue 5.make_heap 6.set 1.容器适配器 利用基本容器构造的容器,称之为容器适配器 基本 ...
- 优先级队列(Priority Queue)
优先级队列(Priority Queue) 注:队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素.但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素, ...
- 优先级队列实现哈夫曼树的编码和译码
//优先级队列实现的哈夫曼树的编码和译码 #include<iostream> #include<queue> #include<string> using nam ...
- 使用最小堆使用优先级队列(c语言版本)
下面的例子来自Weiss的<数据结构与算法分析:c语言描述>,自己亲自敲了一遍,跑了个demo,并将结果记录下来. binheap.h的头文件声明 //description: 使最小堆实 ...
- 浅谈算法和数据结构: 五 优先级队列与堆排序
原文:浅谈算法和数据结构: 五 优先级队列与堆排序 在很多应用中,我们通常需要按照优先级情况对待处理对象进行处理,比如首先处理优先级最高的对象,然后处理次高的对象.最简单的一个例子就是,在手机上玩游戏 ...
- C++ 优先级队列 priority_queue
优先级队列(priority_queue)是一种容器适配器(container adaptor).它要求容器具有front.push_back.pop_back等操作,并且容器具有随机访问的能力,故优 ...
- 优先级队列(头条面试题)
来源:算法面试题 优先级队列,不同于先进先出队列,其对每一个元素指定了优先级,一般情况下,出队时,优先级越高的元素越先出队.在面试过程中,优先级队列是面试官喜欢问的一个考点. 问题 (头条一面面试题) ...
最新文章
- java按位取反“~“运算符,负数右移
- bat java 启动脚本_从bat脚本运行的Java应用程序上的Windows关闭挂钩
- 如何给SpringBoot配置轻松加密?
- 求给定精度的简单交错序列部分和(c语言)
- mysql数据表案例_mysql中库和表的简单操作案例
- Linux运维基础入门(二):网络基础知识梳理02
- shop++ jtm2.5最新版本发布
- 2019年BAT面试通关宝典:数据结构+JVM+并发编程+分布式...
- js中进行字符串替换的方法
- openlayer 图层上下_OpenLayers 之 图层(Layers) 详解
- 网络安全与渗透:sql注入,一文详解(九)此生无悔入华夏,男儿何不带吴钩
- Creational.Builder建造者模式:构造流程和具体实现的分离
- 计算机网络数据传输率的基本单位是,计算机网络中,数据的传输速度常用的单位是什么...
- Java 统计连续签到天数
- 帝国cms html5 编辑器,帝国cms后台编辑器自动排版插件
- 应用多开,定位,机型伪装这都有
- java.lang.RuntimeException: Method w in android.util.Log not mocked Androidstudio单元测试配置build.gradle
- list中的元素升序排列
- 58沈剑-数据库使用规范
- 删除姓名、年龄重复的记录——数据库