[C++随想录] 优先级队列

news2024/11/24 8:40:29

优先级队列

  • 基本使用
  • 题目训练

基本使用

priority_queue, 优先级队列, 又叫做双端队列, 头文件也是 <queue>
别看它叫做队列, 其实它是一个


补充一下概念:

  1. 大根堆 — — 每一棵树的父节点比它的孩子都大
  2. 小跟堆 — — 每一棵树的父节点比它的孩子都小

👇👇👇

void test()
{
	// 默认构建的是一个大堆
	priority_queue<int> pq;
	pq.push(1);
	pq.push(5);
	pq.push(4);
	pq.push(9);
	pq.push(10);
	pq.push(6);

	while (!pq.empty())
	{
		cout << pq.top() << " ";
		pq.pop();
	}


}

int main()
{
	test();

	return 0;
}

运行结果:

10 9 6 5 4 1

注意:
不要被这里的按序输出迷惑了,
优先级队列的内部结构是堆, 堆的内部结构是不一定按照元素的顺序排列的。

  • 那如果我们要 小跟堆输出呢?
void test()
{
	// 仿函数控制, greater是构建小跟堆
	priority_queue<int,vector<int>, greater<int> > pq;
	pq.push(1);
	pq.push(6);
	pq.push(20);
	pq.push(15);
	pq.push(8);
	pq.push(2);
	pq.push(6);
	pq.push(4);
	pq.push(9);
	pq.push(10);

	while (!pq.empty())
	{
		cout << pq.top() << " ";
		pq.pop();
	}


}

int main()
{

	test();

	return 0;
}

运行结果:

1 2 4 6 6 8 9 10 15 20
  1. 要构建小跟堆, 我们要用 greater
  2. 由于仿函数是最后一个参数, 那么处于中间位置的 容器适配器 也要给个参数

如何使用


  • 使用迭代区间初始化
void test()
{
	vector<int> vec;
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(9);
	vec.push_back(8);
	vec.push_back(7);

	priority_queue<int> pq(vec.begin(), vec.end());
	while (!pq.empty())
	{
		cout << pq.top() << " ";
		pq.pop();
	}
	cout << endl;

}

int main()
{
	test();

	return 0;
}

运行结果:

9 8 7 2 1

当然我们也可以 建小堆

void test()
{
	vector<int> vec;
	vec.push_back(1);
	vec.push_back(2);
	vec.push_back(9);
	vec.push_back(8);
	vec.push_back(7);

	priority_queue<int,vector<int>, greater<int> > pq(vec.begin(), vec.end());
	while (!pq.empty())
	{
		cout << pq.top() << " ";
		pq.pop();
	}
	cout << endl;

}

int main()
{
	test();

	return 0;
}

运行结果:

1 2 7 8 9

题目训练

  1. 数组中的第K个最大元素

这是我们熟悉的 TopK问题.
那么问题来了, 要求时间复杂度是 O(n), 我们是建小堆还是大堆呢?
其实, 建小堆 和 建大堆都是一样的

  1. 建大堆
    1. 建大堆 — — 时间复杂度是 O(n)
    2. pop (k-1) 次 — — 向上调整算法, 时间复杂度是 O(logN)
    3. 堆顶元素就是答案

总体的时间复杂度是 O(n)

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) 
    {
        // 1. 建大堆 
        // 建堆 -- O(n)
        priority_queue<int> pq(nums.begin(), nums.end());

        // 2. pop(k-1)次
        // pop, 向上调整算法 -- O(logN)
        while(--k)
        {
            pq.pop();
        }
        
        return pq.top();
    }
};
  1. 建小堆
    1. 建一个 个数为K的小堆 — — 时间复杂度是 O(K)
    2. 将剩余元素中的 大于堆顶元素的数据 插入堆中 — — 时间复杂度是 (N-K)l ogK
      1. 如果 K很大, 那么时间复杂度是 O(log K)
      2. 如果 K很小, 那么时间复杂度是 O(N)
    3. 返回堆顶元素

总体的时间复杂度是 O(n)

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) 
    {
        // 1. 建小堆 
        // 建堆 -- O(n)
        priority_queue<int, vector<int>, greater<int> > pq(nums.begin(), nums.begin()+k);

        // 2. pop
        // pop, 向上调整算法 -- O((N-K) logK)
        // push, 向上调整算法 -- O((N-K) logK)
        for(int i = k; i < nums.size(); i++)
        {
            if(nums[i] > pq.top())
            {
                pq.pop();
                pq.push(nums[i]);
            }
        }

        return pq.top();

    }
};

弟子曰:此学甚好,只是簿书讼狱繁难,不得为学。
阳明曰:簿书讼狱之间,无非实学;若离了事物为学,却是着空。
译文:
弟子说:先生的学问很好,但是平时工作太忙了,没空修习。
先生说:学问不能脱离工作,在工作中修行,才是真正的学习。如果脱离了实际事务,那修行就没用了。
王阳明认为:工作就是最好的修行。
把工作中遇到的烦恼,当成磨炼自己心性的机会;
把工作中的怠惰懒散,当成改变自己态度的试炼;
把工作中的愤怒委屈,当成放大格局的磨砺。
稻盛和夫说:工作中修行,是帮助我们提升心性和培养人格的最重要、也是最有效的方法。
工作是用,修身是体 ,用成长的心态去工作,就是一个人最好的修行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二极管的直流等效电路和微变等效电路

二级管的主要参数 1.IF&#xff08;最大整流的电流&#xff09; 二极管长期工作做能够通过电流的平均最大值&#xff1a;物理意义&#xff1a;功率电流值。 2.UR 二极管最高反向工作电压 需要留有裕度&#xff0c;通常能达到一半的裕度&#xff1b;UR不能等于UBR。 3.IR 未击穿…

【python海洋专题九】Cartopy画地形等深线图

【python海洋专题九】Cartopy画地形等深线图 水深图基础差不多了&#xff0c;可以换成温度、盐度等 本期加上等深线 本期内容 1&#xff1a;地形等深线 cf ax.contour(lon, lat, ele[:, :], levelsnp.linspace(-9000,-100,10),colorsgray, linestyles-,linewidths0.25, t…

C++标准模板(STL)- 类型支持 (std::size_t,std::ptrdiff_t,std::nullptr_t)

对象、引用、函数&#xff08;包括函数模板特化&#xff09;和表达式具有称为类型的性质&#xff0c;它限制了对这些实体所容许的操作&#xff0c;并给原本寻常的位序列提供了语义含义。 附加性基本类型及宏 sizeof 运算符返回的无符号整数类型 std::size_t 定义于头文件 <…

Ubuntu20配置Mysql常用操作

文章目录 版权声明ubuntu更换软件源Ubuntu设置静态ipUbuntu防火墙ubuntu安装ssh服务Ubuntu安装vmtoolsUbuntu安装mysql5.7Ubuntu安装mysql8.0Ubuntu卸载mysql 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程…

设计模式10、外观模式Facade

解释说明&#xff1a;外观模式&#xff08;Facade Pattern&#xff09;又称为门面模式&#xff0c;属于结构型模式 Faade 为子系统中的一组接口提供了一个统一的高层接口&#xff0c;该接口使得子系统更加容易使用 外观&#xff08;Facade)角色&#xff1a;为多个子系统对外提供…

WorldPop2000年至2020年的全中国的人口统计数据

简介 WorldPop于2013年10月启动&#xff0c;将AfriPop&#xff0c;AsiaPop和AmeriPop人口绘图项目结合在一起。它旨在为中美洲和南美洲&#xff0c;非洲和亚洲提供一个开放的空间人口统计数据集存档&#xff0c;以支持发展&#xff0c;灾害应对和卫生应用。 平台中的WorldPop数…

【LeetCode热题100】--102.二叉树的层序遍历

102.二叉树的层序遍历 广度优先搜索&#xff1a; 我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态&#xff0c;它表示某个节点和它所在的层数&#xff0c;每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类&…

通信原理框图总结

第一章 绪论 模拟通信系统模型 数字通信系统模型 第二章 调制信道和编码信道的划分 第三章 相移法产生SSB信号 有噪声的相干解调器 倍频法产生WBFM 第四章 非均匀量化PCM系统框图 增量调制波形及其编码 第五章 第一类部分响应系统组成的框图 眼图模型 第六章 2ASK信号的解…

用友U8 crm客户关系管理存在任意文件上传漏洞

用友U8 crm客户关系管理存在任意文件上传漏洞 一、 用友U8 crm客户关系管理简介二、漏洞描述三、影响版本三、fofa查询语句五、漏洞复现六、POC&EXP1.发送文件md5的1234内容2.发送请求包如果有md5就表示成功小龙POC检测 七、修复建议 免责声明&#xff1a;请勿利用文章内的…

【Seata】深入解读分布式事务解决方案

文章目录 1. 事务概述1.1 本地事务1.2 分布式事务 2. 分布式事务解决方案2.1 两阶段提交型&#xff08;2PC&#xff09;2.2 三阶段提交型&#xff08;3PC&#xff09;2.3 TCC补偿型2.4 最终一致性型2.5 最大努力通知型事务 3. Seata概述3.1 AT事务模式3.2 XA模式3.3 TCC模式3.4…

WSL2安装历程

WLS2安装 1、系统检查 安装WSL2必须运行 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11。 查看 Windows 版本及内部版本号&#xff0c;选择 Win R&#xff0c;然后键入winver。 2、家庭版升级企业版 下载HEU_KMS_Activ…

UGUI交互组件Button

一.初识Button对象 从菜单中创建Button对象&#xff0c;Button的文本由子节点Text对象显示&#xff0c;Button对象的组件除了基础组件外&#xff0c;还有Image用来显示Button常规态的图片&#xff0c;还有Button组件用来控制点击过渡效果和点击事件的响应。 二.Button组件的属…

QGIS文章二——DEM高程裁剪和3D地形图

经常看到别人基于高程文件制作出精美的3D地图&#xff0c;笔者按照互联网几种制作方式进行尝试后&#xff0c;写的DEM高程裁剪和3D地形图教程&#xff0c;或许其中有一些错误的&#xff0c;也请指出。 本文基于海南省的shp文件和海南省DEM高程文件&#xff0c;制作海口地区的3D…

软件工程与计算总结(一)软件工程基础

国庆快乐&#xff0c;今天开始更新《软件工程与计算&#xff08;卷二&#xff09;》的重要知识点内容~ 一.软件 1.软件独立于硬件 早期的软件是为了计算机硬件在研究型项目中而开发制造的&#xff0c;人们使用专门针对于硬件的指令码和汇编语言编写&#xff0c;这也是最早软件…

CentOS安装OpenNebula(二)

被控端部署&#xff1a; 先要配置好yum源&#xff1a; [rootmaster yum.repos.d]# vim opennebula.repo[rootmaster yum.repos.d]# cat opennebula.repo [opennebula] nameopennebula baseurlhttps://downloads.opennebula.org/repo/5.6/CentOS/7/x86_64 enabled1 gpgkeyhttps…

【2023年11月第四版教材】第17章《干系人管理》(第二部分)

第17章《干系人管理》&#xff08;第二部分&#xff09; 4 过程1-识别干系人4.1 数据收集★★★4.3数据分析4.4 权力利益方格4.5 数据表现&#xff1a;干系人映射分析和表现★★★ 5 过程2-规划干系人参与5.1 数据分析5.2 数据表现★★★5.2.1 干系人参与度评估矩阵★★★ 5.3 …

短期风速预测|LSTM|ELM|批处理(matlab代码)

目录 1 主要内容 LSTM-长短时记忆 ELM-极限学习机 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序是预测类的基础性代码&#xff0c;程序对河北某地区的气象数据进行详细统计&#xff0c;程序最终得到pm2.5的预测结果&#xff0c;通过更改数据很容易得到风速预测结…

【STM32基础 CubeMX】uart串口通信

文章目录 前言一、uart串口通信是什么二、cubeMX配置uart三、代码分析3.1 CubeMX代码分析3.2 以中断启动串口接收3.3 以查询方式发送数据3.4 串口回调函数 四、示例代码4.1 最简单的使用4.2 实现fputc函数以使用printf函数 总结 前言 在嵌入式系统开发领域&#xff0c;串口通信…

C#,数值计算——Ranq1的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Recommended generator for everyday use.The period is 1.8E19. Calling /// conventions same as Ran, above. /// </summary> public class Ranq1 { …

含分布式电源的配电网可靠性评估(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考《基于仿射最小路法的含分布式电源配电网可靠性分析》文献方法&#xff0c;通过概率模型和时序模型分别进行建模&#xff0c;实现基于概率模型最小路法的含分布式电源配电网可靠性评估以及时序模型…