理解至上:二叉堆与优先队列详细用法
文章目录
- 二叉堆
- 概述
- 插入
- 代码
- 访问
- 代码
- 完整代码
- 优先队列:priority_queue
- 基本用法
- 小根堆的声明:
- 结构体
- 注意
- Thanks for reading!
二叉堆
概述
为什么不用pq呢
算比较简单的数据结构了
它可以用log的时间复杂度插入元素和访问(取出)最大(小)值(最大和最小只能取一个!)
缺点是除了干这个基本没有别的延伸用法。。。
主要性质(以大根堆为例,小根堆反过来就行):
1.是一棵二叉树(废话)
2.爸爸结点永远比儿子大(核心性质)
具体来看看代码实现吧~
插入
先把新元素放在队尾
只要没有到堆顶就不断尝试和爸爸交换;
如果比它的爸爸大,就可以交换
代码
void put(int k){tree[++len]=son;//先放在队尾int son=len;while(son>1){//只要没有到堆顶就不断尝试和爸爸交换:如果比它的爸爸大,就交换int fa=son>>1;if(tree[fa]>tree[son]) return;//如果比爸爸小的话就可以结束交换了swap(tree[fa],tree[son]);son=fa;}return;
}
访问
先取出堆顶的最大值
把当前的队尾填到队首的位置
只要有儿子就不断尝试与儿子交换
如果比儿子中任何一个小,就与其交换
代码
int get(){int res=tree[1];//先取出堆顶的最大值tree[1]=tree[len--];//把当前的队尾填到队首的位置int fa=1;while(2*fa<=len){//只要有儿子就不断尝试与儿子交换:如果比儿子中任何一个小,就与其交换int son=2*fa;if(son<len&&tree[son]<tree[son+1]) son++;//找到较大的那个儿子if(tree[son]<tree[fa]) break;swap(tree[son],tree[fa]);fa=son;}return res;
}
完整代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
const int N=1e5+100;
int tree[N];
int n,len;
int flag,x;
void put(int k){tree[++len]=k;//先放在队尾int son=len;while(son>1){//只要没有到堆顶就不断尝试和爸爸交换:如果比它的爸爸大,就交换int fa=son>>1;if(tree[fa]>tree[son]) return;//如果比爸爸小的话就可以结束交换了swap(tree[fa],tree[son]);son=fa;}return;
}
int get(){int res=tree[1];//先取出堆顶的最大值tree[1]=tree[len--];//把当前的队尾填到队首的位置int fa=1;while(2*fa<=len){//只要有儿子就不断尝试与儿子交换:如果比儿子中任何一个小,就与其交换int son=2*fa;if(son<len&&tree[son]<tree[son+1]) son++;//找到较大的那个儿子if(tree[son]<tree[fa]) break;swap(tree[son],tree[fa]);fa=son;}return res;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&flag);if(flag==1){scanf("%d",&x);put(x);}else printf("%d\n",get());}return 0;
}
优先队列:priority_queue
基本用法
priority_queue
需要头文件:queue
有这东西写什么二叉树啊
具体用法:
声明:priority_queue q;
插入元素:q.push(x);
访问堆顶:q.top();
弹出堆顶:q.pop();
以下是之前那段代码使用pq的版本:
int main(){scanf("%d",&n);priority_queue<int>q;for(int i=1;i<=n;i++){scanf("%d",&flag);if(flag==1){scanf("%d",&x);q.push(x);}else{printf("%d\n",q.top());q.pop();}}return 0;
}
简便程度不言而喻
小根堆的声明:
priority_queue<int,vector<int>,greater<int> (注意这里必须有个空格!)> q;
结构体
也可以用结构体,只是需要重载一下运算符 <:
struct node{int value;bool operator < (const node y)const{return value<y.value;};
};
int main(){priority_queue<node>q;int v;node o;q.push((node){v});//这里就是看个具体操作的用法,具体怎么操作看你需求啦~o=q.front();q.pop();return 0;
}
注意
1.当你已经pop完所有元素再取堆顶时,它会一直给你弹出的最后一个
2.而当你根本没push就直接访问top时,会直接RE
Thanks for reading!
理解至上:二叉堆与优先队列详细用法相关推荐
- 关于二叉堆(优先队列)的其他操作及其应用
[0]README 0.1)本文总结于 数据结构与算法分析:源代码均为原创, 旨在了解到我们学习了优先队列后,还能干些什么东西出来, 增加学习的interest: 0.2)以下列出了 关于二叉堆(优先 ...
- 二叉堆的优先队列基本原理及实现
原理: 传统的队列是先进先出的数据结构,队列的重要变种称为优先级队列 二叉堆常见的遍体:最小堆(其中最小的键在前面)和最大堆(其中最大的键值总是在前面) 代码实现
- 数据结构之优先队列--二叉堆(Java实现)
前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...
- 二叉堆与自定义优先队列实现删除任意元素
二叉堆与自定义优先队列实现删除任意元素 堆Heap 二叉堆Binary Heap 二叉堆 二叉堆的实现 插入(insert) 取出堆顶(extract / delete max) 优先队列(Prior ...
- 优先队列与相关题目(Python、二叉堆)
1. 优先队列知识 1.1 优先队列简介 优先队列:一种特殊的队列.在优先队列中,元素被赋予优先级,当访问队列元素时,具有最高优先级的元素最先删除. 优先队列与普通队列最大的不同点在于出队顺序 普通队 ...
- 利用二叉堆实现最小优先队列
利用二叉堆实现最小优先队列 package 第二章数据结构基础;import java.util.Arrays;public class 二叉堆和优先队列 {public static void ma ...
- 【数据结构与算法拓展】二叉堆原理、实现与例题(C和java)
前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...
- 二叉堆算法具体实现细节- Java实现
前言:之前在学习二叉堆算法时,感觉自己明白了.但是当我自己去写代码的时候,或者回想的时候,却很难系统的描述出来.在仔细研究源码之后,发现了一些之前没有发现的新东西,特地,记录下来,供大家参考. 文章目 ...
- 大根堆的删除c语言,二叉堆(一)之 C语言详解
本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...
最新文章
- BZOJ 2157 「国家集训队」旅游(树链剖分,线段树,边权转点权)【BZOJ计划】
- C#二进制格式与文件相互转换
- AS3汉字sokcet传送编码问题
- 图像白化MATLAB代码实现
- IE下及标准浏览器下的图片旋转(二)—— Canvas(2)
- 7-14 排座位 (25 分)
- 【学习笔记:计算几何基础3】 Convex Hull
- 计算机等级考试二级C语言考试环境VS2010学习版以及免费题库
- 51单片机复习:红外通信
- 基于SSM实现微博系统
- Spring中的DataSource
- html页面层级关系,CSS z-index 层级关系优先级的概念
- 宏转录组方法_土壤宏转录组RNA的提取方法评价
- 北京市海外学人中心《北京市留学人员工作居住证》攻略
- 学习OpenCV(中文版)
- 给win10平板来个标准USB+充电
- Plonky = Plonk + Halo + Rescue
- 智能家居生态:华为、小米各异
- R语言方差分析的注意事项
- 深入理解混合精度训练:从 Tensor Core 到 CUDA 编程
热门文章
- mysql 参数化 c_MySQL(16):参数化、封装
- mysql中如何删除表中int约束,MySQL中的约束,添加约束,删除约束,以及其他修饰
- jsp iframe嵌入php,jsp嵌套iframe从iframe中表单提交并传值到外层_html/css_WEB-ITnose
- comment desc显示表结构_MySQL 查看表结构简单命令
- linux命令clock,简单了解Linux系统中clock命令的使用方法
- st link v2引脚连接_ST-Link资料02_ST-Link固件介绍,及固件命名规则
- linux实验目的能学会什么意思,Linux实验.doc
- druid字段级_Druid的数据结构
- 算法与数据结构——并查集
- c++——优先队列(priority_queue)