【算法竞赛】堆

堆是一种树形结构,树的根是堆顶,堆顶始终保持为所有元素的最优值。

有最大堆和最小堆,最大堆的根节点是最大值,最小堆的根节点是最小值。

本节都以最小堆为例进行讲解。

堆一般用二叉树实现,称为二叉堆。

二叉堆的典型应用有堆排序和优先队列。

二叉堆的概念

二叉堆是一棵完全二叉树。

用数组实现的二叉树堆,树中的每个节点与数组中存放的元素对应。

树的每层,除了最后一层可能不满,其他都是满的。

如图1.10所示,用数组实现一棵二叉树堆。
在这里插入图片描述
二叉堆中的每个节点,都是以它为父节点的子树的最小值。

用数组A[]存储完全二叉树,节点数量为n,A[1]为根节点,有以下性质:
(1) i > 1 i>1 i>1 的节点,其父节点位于 i / 2 i/2 i/2
(2)如果 2 i > n 2 i>n 2i>n ,那么节点i没有孩子;如果 2 i + 1 > n 2 i+1>n 2i+1>n ,那么节点i没有右孩子;
(3)如果节点i有孩子,那么它的左孩子是2i,右孩子是 2 i + 1 2 i+1 2i+1

堆的操作有进堆和出堆:
(1)进堆:每次把元素放进堆,都调整堆的形状,使根节点保持最小。
(2)出堆:每次取出的堆顶,就是整个堆的最小值;同时调整堆,使新的堆顶最小。
二叉树只有 O ( l o g 2 n ) O(log _{2} n) O(log2n) 层,进堆和出堆逐层调整,计算复杂度都为 O ( l o g 2 n ) O(log _{2} n) O(log2n)

二叉堆的操作

堆的操作有两种 :上浮和下沉。

上浮

某个节点的优先级上升,或者在堆底加人一个新元素(建堆,把新元素加入堆),此时需要从下至上恢复堆的顺序。

图1.11演示了上浮的过程。
在这里插入图片描述

下沉

某个节点的优先级下降,或者将根节点替换为一个较小的新元素(弹出堆顶,用其他元素替换它),此时需要从上至下恢复堆的顺序。
图1.12演示了下沉的过程。
在这里插入图片描述
在这里插入图片描述
堆经常用于实现优先队列,上浮对应优先队列的插入操作push(),下沉对应优先队列的删除队头操作pop()。

二叉堆的手写代码

例1.8(洛谷P3378)
在这里插入图片描述
下面给出代码。
上浮用push()函数实现,完成插入新元素的功能,对应优先队列的入队;
下沉用pop()函数实现,完成删除堆头的功能,对应优先队列的删除队头。

#include <bits/stdc+t.h>
using namespace std;
const int N=1e6+5; 
int heap[N],1en=0; //1en记录当前二叉树的长度void push(int x) {heap[++len]=x;int i=len;while (i>1 && heap[i]<heap[i / 2]) {swap(heap[i], heap[i /2]);}i=i/ 2;
}void pop() {heap[1]= heap[len--];int i=1;while(2* i<=len) {int son =2*i;if (son <len && heap[ son +1]< heap[ son]) {son++;}if (heap[ son] < heap[i]) {swap(heap[ son], heap[ i]);i=son;} else break;}
}int main() {int n;scanf ("%d", &n);while(n--) {int op;scanf("%d", &op);if (op==1) {int x;scanf("%d", &x);push(x);} else if (op==2) {printf("%d\n", heap[1]);} else {pop();}}return 0;
}

堆和priority_queue

STL的优先队列priority_queue是用堆实现的。下面给出洛谷P3378的STL代码,由于不用自己管理堆,代码很简洁。

using namespace std;
#include <bits/stdc++.h>
priority_queue<int, vector<int>, greater<int>> q;
int main() {int n;scanf("%d", &n);while (n--) {int op;scanf("%d", &op);if (op == 1) {int x;scanf("%d", &x);q.push(x);} else if (op == 2) {printf("%d\n", q.top());} else {q.pop();}}return 0;
}

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

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

相关文章

定时器定时中断定时器外部中断

基础背景&#xff1a;TIM定时中断-CSDN博客 TIM的函数 // 恢复缺省设置 void TIM_DeInit(TIM_TypeDef* TIMx); // 时基单元初始化&#xff0c;第一个参数TIMx选择某个定时器&#xff0c;第二个参数是结构体&#xff0c;包含了配置时基单元的一些参数。 void TIM_TimeBaseInit…

blender解决缩放到某个距离就不能继续缩放

threejs中也存在同样的问题&#xff0c;原因相同&#xff0c;都是因为相机位置和相机观察点距离太近导致的。 threejs解决缩放到某个距离就不能继续缩放-CSDN博客 blender中的解决方案 1、视图中心->视图锁定->选择你想看的物体

图解C#高级教程(三):泛型

本讲用许多代码示例介绍了 C# 语言当中的泛型&#xff0c;主要包括泛型类、接口、结构、委托和方法。 文章目录 1. 为什么需要泛型&#xff1f;2. 泛型类的定义2.1 泛型类的定义2.2 使用泛型类创建变量和实例 3. 使用泛型类实现一个简单的栈3.1 类型参数的约束3.2 Where 子句3…

安装图片标识工具anylabeling

目录 下载压缩包 创建环境 安装opencv 安装第三方库 运行setup.py文件 安装过程可能会出现的错误&#xff1a; 错误1 错误2 安装完成 图标更换 之前提到的嵌入式开发】可编程4k蓝牙摄像头点击器还可以训练模型&#xff0c;使图像识别精度提高 现在讲解&#xff0c;如…

uniapp微信小程序,获取上一页面路由

在进入当前页面的时候&#xff0c;判断是不是从某个页面跳转过来的&#xff08;一般是当前页面为公共页面是出现的&#xff09;&#xff0c;比如 A-->B C-->B ,那么 要在 C跳转到B页面的时候多个提示语什么的 而在A跳转到B时不需要&#xff0c;那么就要判断 上一页面的…

前端规范工程-5:Git提交信息规范(commitlint + czg)

前面讲的都是在git提交之前的一些检查流程&#xff0c;然而我们git提交信息的时候&#xff0c;也应该是需要规范的。直接进入主题&#xff1a; 目录 需安装插件清单commitlint 介绍安装配置配置commit-msg钩子提交填写commit信息czg后续方式一&#xff1a;push触动build并上传…

DataEase v2 开源代码 Windows 从0到1环境搭建

一、环境准备 功能名称 描述 其它 操作系统 Windows 数据库 Mysql8.0 开发环境 JDK17以上 本项基于的21版本开发 Maven 3.9版本 开发工具 idea2024.2版本 前端 VSCode TIPS&#xff1a;如果你本地有jdk8版本&#xff0c;需要切换21版本&#xff0c;请看…

深入浅出MySQL事务处理:从基础概念到ACID特性及并发控制

1、什么是事务 在实际的业务开发中&#xff0c;有些业务操作要多次访问数据库。一个业务要发送多条SQL语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行&#xff0c;要么所有的SQL语句全部执行成功。如果其中有一条SQL语句失败&#xff0c;就进行事务的回滚&a…

RabbitMQ的应用问题

一、幂等性保障 幂等性是数学和计算机科学中某些运算的性质, 它们可以被多次应⽤, ⽽不会改变初始应⽤的结果 数学上的幂等性&#xff1a; f(x)f(f(x)) |x| 数据库操作幂等性&#xff1a; 数据库的 select 操作. 不同时间两次查询的结果可能不同, 但是这个操作是符合幂等性…

教务系统登录的分析

武汉纺织大学屏蔽了正方教务系统的默认登录页面&#xff0c;他们学校自定义的登录页面用户名和密码都是明文传输。可以使用Httpclient模拟登录。手动登录后&#xff0c;5次get请求才能获得真实的cookies。合肥工业大学需要3次。 第一次是POST请求。 Post请求的的下一个Location…

yum使用阿里云的镜像源报错 Failed connect to mirrors.aliyuncs.com:80; Connection refused“

报错&#xff1a;Failed connect to mirrors.aliyuncs.com:80; Connection refused"&#xff0c;如果单独只是这个报错的话&#xff0c;那么原因是由于非阿里云ECS用户无法解析主机“mirrors.cloud.aliyuncs.com”。如果不单单只是这个报错另外还有其它报错请参考我其它文…

【SQL】筛选字符串与正则表达式

目录 语法 需求 示例 分析 代码 语法 SELECT column1, column2, ... FROM table_name WHERE condition; WHERE 子句用于指定过滤条件&#xff0c;以限制从数据库表中检索的数据。当你执行一个查询时&#xff0c;WHERE 子句允许你筛选出满足特定条件的记录。如果记录满…

[RabbitMQ] 7种工作模式详细介绍

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Android Studio 新版本 Logcat 的使用详解

点击进入官方Logcat介绍 一个好的Android程序员要会使用AndroidStudio自带的Logcat查看日志&#xff0c;会Log定位也是查找程序bug的第一关键。同时Logcat是一个查看和处理日志消息的工具&#xff0c;它可以更快的帮助开发者调试应用程序。 步入正题&#xff0c;看图说话。 点…

特征工程——一门提高机器学习性能的艺术

当前围绕人工智能(AI)和机器学习(ML)展开的许多讨论以模型为中心&#xff0c;聚焦于 ML和深度学习(DL)的最新进展。这种模型优先的方法往往对用于训练这些模型的数据关注不足&#xff0c;甚至完全忽视。类似MLOps的领域正迅速发展&#xff0c;通过系统性地训练和利用ML模型&…

Hive SQL业务场景:连续5天涨幅超过5%股票

一、需求描述 现有一张股票价格表 dwd_stock_trade_dtl 有3个字段分别是&#xff1a; 股票代码(stock_code), 日期(trade_date)&#xff0c; 收盘价格(closing_price) 。 请找出满足连续5天以上&#xff08;含&#xff09;每天上涨超过5%的股票&#xff0c;并给出连续满足…

C++入门基础知识93(实例)——实例18【猴子吃桃问题】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于猴子吃桃问题的相关内容&#xff01; 关…

IP协议讲解

IP协议 IP协议的本质&#xff1a;提供一种能力&#xff0c;将数据跨网络从A主机传输到B主机 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. 4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大 的数字是15, 因…

天坑!Spark+Hive+Paimon+Dolphinscheduler

背景: 数据中台项目使用Spark+Hive+Paimon做湖仓底层,调度任务使用的是基于Dolphinscheduler进行二开。在做离线脚本任务开发时,在Paimon库下执行非查询类SQL报错。 INSERT报错 DELETE报错 现状: 原始逻辑为数据中台中选择的Paimon数据源,实际上在Dolphinscheduler中是…

视频集成与融合项目中需要视频编码,但是分辨率不兼容怎么办?

在众多视频整合项目中&#xff0c;一个显著的趋势是融合多元化的视频资源&#xff0c;以实现统一监管与灵活调度。这一需求促使项目团队不断探索新的集成方案&#xff0c;确保不同来源的视频流能够无缝对接&#xff0c;共同服务于统一的调看与管理平台&#xff0c;进而提升整体…