堆(不是STL中的堆)

【STL】堆 【STL】常用容器总结,带有复习性质的学习更有效率;【Heap】 在STL中不是以容器的方式呈现的,而是以算法的方式;所谓堆,其实就是将数组假想成完全二叉树,满足某种规则的呈现。 某种规则就是堆顶(数组第一个元素)始终为最大或者最小的元素,还可以结合数组连续性的特性进行堆排序;堆分为 max heap 和 min heap, STL默认的是 max heap , 所以下面实现的时候也会 阅读详情

堆简介详情见:https://oi-wiki.org/ds/heap/

堆 完全二叉树 (用一维数组存)
STL中的堆就是优先队列
手写堆:
    堆支持的操作:heap表示堆,size表示堆的大小,下标从1开始
    1.插入一个数                  heap[++size]=x;up(size);
    2.求集合当中的最小值          heap[1];
    3.删除最小值                  heap[1]=heap[size--];down(1);
    4.删除任意一个元素          heap[k]=heap[size--];dowm(k);up(k);
    5.修改任意一个元素            heap[k]=x;down(k);up(k);
    
堆结构:一棵完全二叉树        小根堆:每个节点小于左右儿子,根节点是最小值
堆的存储:根节点是1(下标),x的左儿子:2x(下标),x的右儿子:2x+1(下标)

down(x)节点往下调整 O(logn)            up(x)节点往上调整 O(logn)

题目来源:Acwing---838-堆排序

代码如下

#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int n,m,h[N],s;
void down(int u){
	int t=u;
	if(u*2<=s&&h[u*2]<h[t])t=u*2;
	if(u*2+1<=s&&h[u*2+1]<h[t])t=u*2+1;
	if(u!=t){
		swap(h[u],h[t]);
		down(t);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&h[i]);
	s=n;
	for(int i=n/2;i;i--)down(i);
	while(m--){
		printf("%d",h[1]);
		h[1]=h[s];
		s--;
		down(1);
	}
	return 0;
}

题目来源:Acwing---839-模拟堆

输入样例

8
I -10
PM
I -10
D 1
C 2 8
I 6
PM
DM

输出样例

-10
6

代码如下:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=100010;
int h[N],ph[N],hp[N],size;//ph[k]存第k个插入的数在堆里面的下标  hp存堆里面的某一个点是第几个插入的点  如果ph[j]=k,则hp[k]=j
void heap_swap(int a,int b){
	swap(ph[hp[a]],ph[hp[b]]);
	swap(hp[a],hp[b]);
	swap(h[a],h[b]);
}
void down(int u){
	int t=u;
	if(u*2<=size&&h[u*2]<h[t])t=u*2;
	if(u*2+1<=size&&h[u*2+1]<h[t])t=u*2+1;
	if(u!=t){
		heap_swap(u,t);
		down(t);
	}
}
void up(int u){
	while(u/2&&h[u/2]>h[u]){	//存在父节点&&父节点大于当前这个节点
		heap_swap(u/2,u);
		u/=2;
	}
}
int main(){
	int n,m=0;
	scanf("%d",&n);
	while(n--){
		char op[10];
		scanf("%s",op);
		int k,x;
		if(!strcmp(op,"I")){
			scanf("%d",&x);
			size++;
			m++;
			ph[m]=size,hp[size]=m;
			h[size]=x;
			up(size);
		}
		else if(!strcmp(op,"PM"))printf("%d\n",h[1]);
		else if(!strcmp(op,"DM")){
			heap_swap(1,size);
			size--;
			down(1);
		}
		else if(!strcmp(op,"D")){
			scanf("%d",&k);
			k=ph[k];
			heap_swap(k,size);
			size--;
			down(k),up(k);
		}
		else{
			scanf("%d%d",&k,&x);
			k=ph[k];
			h[k]=x;
			down(k),up(k);
		}
	}
	return 0;
}

PAT L2-012. 关于堆的判断【数据结构】 题目链接https://www.patest.cn/contests/gplt/L2-012思路题目本身不难,就是字符串处理有点繁琐。 但是有个巨坑!就是你必须得边push边造堆,不能一次性读完再造堆,两者造出来的顺序是不一样的!为此改了十多遍(累觉不爱) 这里用了STL的make_heap,自己手写也可以,不怎么长。AC代码#include <iostream> #include <queue 阅读详情

相关推荐

C++STL堆操作

C++STL堆操作并没有什么用的更新时间定义原因某玄学方法 并没有什么用的更新时间 【2019/02/21】 17:55 第一次更新(疑似更完) 定义 优先队列 需要调动到#include&amp;lt;queue&amp;gt;,以下以a为例: 大根堆的调用:priority_queue&amp;lt;int&amp;gt;a; 小根堆的调用:priority_queue&amp;lt;int,vector&amp;lt;int&amp

qq_44618728的博客 4885

【堆】二分堆的实现以及STL中的堆

堆的概念binary_heap就是一种完全二叉树,也就是说整棵二叉树除了最底层的叶节点之外,是填满的,而最底层的叶节点由左至右又不得有空隙。底层实现就是一个数组 vector。 如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2*i+1 且 Ki<= K2*i+2(Ki >= K2*i+1 且

菜鸟成长记 2323

acm-【堆】学习笔记(二叉堆、左偏树、配对堆、斐波拉契堆、斜堆、STL)

引言 本文主要针对作者本人复习使用,相关基础知识点不会讲述。 目录引言二叉堆左偏树斜堆配对堆二项堆斐波拉契堆STL中的堆堆的应用 二叉堆 二叉堆是最普通的堆,能够实现push,poppush,poppush,pop等基本操作,下面以小根堆为例给出一种常见的实现。 首先设置一个足够大的数组,我们将树的节点按照层次遍历的顺序从小到大依次放置在数组中,数组中的位置也对应是该节点的编号,如下图所示: 上图是一个典型的二叉树,每个节点上标注的数字即是该节点的编号,容易发现对于一个节点uuu而言,它的儿子分别是2u,

qq_30361651的博客 1476

堆(手写堆包含STL)

堆是什么,堆就像是一个金字塔,最顶端的是最值(最大值和最小值),堆其实就是一个二叉树,将最值元素放到根节点。子节点要么都小于父节点,要么都大于父节点。但是写手堆的话,我们用的是数组来存储,所以堆通常也被看做一颗树的数组对象。

qq_46056407的博客 3061

C++ STL堆相关函数的简单使用

C++ STL堆相关函数的简单使用 简单介绍下堆相关的函数的使用 堆不是容器,而是组织容器元素的一种特别方式。 只能确定堆的范围,即开始和结束迭代器指定的范围。 这意味着可以用容器中的元素子序列创建堆,可以在已生成的堆中添加元素。 以vector容器为例: 为了简化代码,vector的读取和输出被打包为两个函数 ↓ vector<int> get_input() { int n;...

AKGWSB 's blog 1285

PTA 7-5 堆中的路径 (25 分) 建堆方式/STL方式

一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。 输入格式: 每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。 输出格式: 对输入中给出的每个下标i,在一行中输出从H[i]到根结点的...

巴拉拉小魔芋 876

STL 堆heap的用法

STL中并没有把heap作为一种容器组件,heap的实现亦需要更低一层的容器组件(诸如list,array,vector)作为其底层机制。Heap是一个类属算法,包含在algorithm头文件中。虽然STL中关于heap默认调整成的是大顶堆,但却可以让用户利用自定义的compare_fuction函数实现大顶堆或小顶堆。heap的低层机制vector本身就是一个类模板,heap基于vector便实

梧桐下的四叶草 1万+

可并堆-STL-pbds详解

对于堆的合并,我们首先想到的是朴素的nlogn出堆之后nlogn入堆。实质上,有一种更为高效的数据结构——可并堆。即为在保证堆顶极值的前提下实现logn的时间合并两个堆。与普通堆相比,左偏树的每个结点多了一个距离值NPL(Null Path Length)即该结点一直向右儿子走,到达空结点的距离。基于NPL,我们便可以发现,交换变得有序了:在保证了左儿子NPL大于右儿子NPL的时候,效率有所提升。

dark玄学家的博客 4565

C++ STL自带的堆

一、STL自带堆:priority_queue stack与queue注意事项: 1 stack不允许有遍历行为,stack也不提供迭代器。SGI STL便以deque作为缺省情况下stack底部结构,称之为adapter(配接器) 2 除了deque之外,list也是双向开口的数据结构 3 queue与stack的情况类似,不提供迭代器,也可以以list作为底层容器,默认为deque。 ...

tankpanv的博客 7184

别再死记硬背了!用Amesim HCD库亲手搭建单向阀、锥阀、球阀模型(附详细参数设置)

本文详细介绍了如何使用Amesim HCD库从零构建单向阀、锥阀和球阀的仿真模型,帮助工程师摆脱死记硬背,掌握物理建模的核心技巧。通过实战案例和参数设置指南,读者将学会如何优化阀门动态响应、验证流量特性以及处理旋转运动等独特挑战,提升液压系统设计效率。

weixin_29248611的博客 501

基于Coze平台从零构建AI智能体:以测试用例生成为例的实战指南

在人工智能技术快速发展的今天,大语言模型(LLM)和提示词工程(Prompt Engineering)已成为构建智能应用的核心技术。其原理在于通过自然语言指令引导模型完成特定任务,其技术价值在于极大地降低了AI应用开发的门槛,使非专业开发者也能快速实现想法。这一技术广泛应用于自动化办公、智能客服、内容生成等场景。本文聚焦于字节跳动旗下的Coze平台,该平台通过可视化工作流编排和预置技能,将上述技术封装为易用的工具。文章以“根据产品需求文档(PRD)自动生成测试用例”这一具体场景为例,详细拆解了从需求分析、工

weixin_30617695的博客 341

7-5 堆中的路径【STL : heap】

将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。 输入格式: 每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。 输出格式: 对输入中给出的每个下标i,在一行中输出从H[i]到根结点...

一定要站在自己热爱的生活里闪闪发光 3万+

基于资源预测的Agent弹性伸缩:在成本与响应延迟间寻找最佳平衡点

手动伸缩:完全由运维人员人工调整副本数或服务器数量,效率极低,现在基本只用于极小规模的业务。反应式伸缩:基于当前实时监控指标触发伸缩规则,比如CPU利用率超过70%就加2个副本,是目前应用最广泛的方案,典型代表是K8s HPA、KEDA。预测式伸缩:基于历史时序数据预测未来的负载,提前进行伸缩,解决反应式伸缩的滞后性问题,典型代表是AWS Predictive Scaling、阿里云预测式HPA。智能Agent伸缩。

SuperAGI2025 135

STL中的堆heap

在STL中堆heap的算法都包含在#include<algorithm>头文件中,主要包含以下函数: make_heap()生成堆,默认less(生成大顶堆) make_heap(_RAIter,_RAIter)默认生成大顶 make_heap(_RAIter,_RAIter,_Compare) _Compare有两种参数,一种是greater(生成小顶堆),一种是les...

blink_cao的博客 283

Ollama本地大模型-个性化AI:训练自己的风格模型和数据投喂打造专属智能体验

之前我们使用Ollama下载了deepseek模型,现在我想将其训练成自己风格的模型,应该怎么做?

瑶山的博客 1784

C#开发的OpenRA游戏之网络接收后找到游戏对象

而这个队列是在创建这个游戏对象时组件,因为一个游戏对象有很多特性,当发现创建游戏对象时有IResolveOrder继承接口的对象,就添加到这个数组。在这里先检查一下命令是否有效的,接着就调用命令的执行对象,即是游戏对象来执行这个命令了。order.Subject就是上面解释游戏对象ID,并从游戏世界里找到的游戏对象,再从各个字段里找到对应的信息,再把这个动作交给游戏世界里的对象执行。从前面分析可知,要找到游戏世界里的对象,就需要游戏对象的ID,因此, 我们来分析游戏对象的ResolveOrder函数。

大坡3D软件开发 1035

[数据结构]堆 | 基于STL优先队列实现的堆 | 堆的拓展应用

堆 优先队列 堆的拓展应用 反悔贪心

Pass1on_W的博客 1686

基于STM32的家庭环境监测毕业设计(全部资料)

本文设计并实现了一套基于STM32的家庭环境监测系统,具备温湿度、烟雾浓度和PM2.5检测功能,通过OLED屏实时显示数据,并能自动或手动控制风扇、加湿器等设备。系统采用分层架构设计,包含数据采集、处理、显示和控制执行模块,经测试性能稳定可靠。研究结果表明,该系统能有效提升家庭环境监测与控制的智能化水平,但仍存在传感器精度和智能化程度不足等问题,未来可进一步优化硬件配置并引入AI算法提升性能。

3254968421的博客 463

STL 最大堆、最小堆的应用

1.priority_queue priority_queue默认是最大堆,要用最小堆的话改变一下比较函数 priority_queueint, vectorint>, lessint>> maxHeap; priority_queueint, vectorint>, greaterint>> minHeap; 也可以自定义比较函数 struct cmp { bool o

沐沐余风的专栏 1万+

在iPad上使用Python进行编程

如果你拥有一台iPad,并且想在上面编写和运行Python代码,你会发现iPad提供了一些适用的工具和应用程序来满足你的需求。安装一个Python解释器应用程序,编写和运行Python代码,使用第三方库和模块,以及存储和共享代码,这些步骤将帮助你在iPad上进行Python编程。要在iPad上运行Python代码,首先需要安装一个Python解释器。这些应用程序提供了一个交互式的开发环境,允许你编写、编辑和运行Python代码。一旦你安装了Python解释器应用程序,你可以开始编写Python代码了。

2301_79366435的博客 4628

Arduino、ESP32驱动AS3935数字闪电传感器(闪电传感器)

闪电传感器采用AMS独具创新的AS3935数字闪电传感芯片与Coilcraft的MA5532-AE专用天线,可在室内或室外,安全地检测方圆40km范围内发生闪电的距离,闪电相对强度与统计闪电发生次数。

不脱发的程序猿 2017

C++ STL容器之heap(堆)篇

没有想到第一次用堆 是在LeetCode的算法题上,作为一个学生党来说,需要用到堆跟堆算法的场景确实比较少。 这篇文章不仅是跟大家分享有关于堆的知识,也是为了通过这种方式巩固我自己对堆的理解。并且我将通过最开始说的拿到LeetCode题来跟大家一起实践堆的使用 。 本期文章代码将用C++来进行说明。

Flowing_River的博客 3299

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

最大堆 最小堆 poj2442 STL堆的使用

最大堆最小堆代码实现 http://blog.youkuaiyun.com/xiaoxiaoxuewen/article/details/7570621 最大堆 最小堆原理图 http://www.cnblogs.com/wu8685/archive/2010/12/30/1922218.html STL 的堆操作 http://hi.baidu.com/solofancy/item/14acd

hnust_xiehonghao的专栏 6193

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

STL堆与手写堆

堆 堆的特点 插入一个数; 求集合中的最小值; 删除最小值; 以上是堆的最基本的特性,C++ STL 实现的小根堆支持上述操作。 删除任意一个元素; 修改如意一个元素; 以上两个特性 STL 堆无法直接实现,但是可以间接实现。 堆是一个完全二叉树。 以小根堆为例子,每个节点的值都小于等于两个子节点。所以根节点是集合的最小值。 STL 堆 STL 堆就是 优先队列。并且实现的堆是 小根堆。 定义: #include <queue> typedef pair<int, int>

qq_44960253的博客 581

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

STL 堆

1.priority_queue priority_queue默认是最大堆,要用最小堆需要比较函数greater<int> priority_queue<int, vector<int>, less<int>> maxHeap; priority_queue<int, vector<int>, greater<int>> minHeap; 也可以自定义比较函数 struct cmp { bool ope

qq_37032670的博客 324

C++STL之堆

C++STL恶心到死,不过学会了就比较便捷,前几天学习了一下C++STL的堆操作,现在来口胡一下^_^first at all: STL堆要用到头文件#include<algorithm>,所以,先把头文件打好吧 下面_first和_last为可以随机访问的迭代器(指针),_comp为比较函数(仿函数),相信大家都明白,但还是啰嗦一下凑字数1.建堆 make_heap(_first,_last

mijoe10的博客 788
上一篇: 并 查 集
下一篇: 哈希-
01star️
博客等级 码龄3年 96粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值