数据结构之堆

news2024/11/23 17:04:30

堆:

堆是一颗完全二叉树,分为大根堆和小根堆两种。大根堆:根节点大于等于左右节点;小根堆:根节点小于等于左右节点。所以大根堆的根节点是最大值,小根堆的根节点是最小值。

c++中priority_queue可以用来声明堆:

大根堆:priority_queue<int,vector<int>,less<int>>q;

小根堆:priority_queue<int,vector<int>,greater<int>>q。

操作:

q.size(),返回堆中的元素个数;q.top(),返回堆顶元素;q.push(x),插入元素x;q.pop(),删除堆顶。

手写堆:

完全二叉树有一个性质:我们假设根节点标号为1,那么每个点的左儿子等于它的下标乘2,右儿子等于它的下标乘2加1。所以我们可以用一个一维数组来模拟堆。

假设我们改变堆中的一个数,那么要使他依旧是一个堆的话,我们需要将其往上移动,或者将其往下移动。

根据上浮和下沉这两个操作,我们可以对堆进行如下操作:

取出/删除堆顶:将堆中最后一个元素(数列中最后一个元素)覆盖到堆顶,然后下沉。

插入元素:向堆的最后面加入一个元素,然后上浮。

删除任意元素:将堆中最后一个元素覆盖到该位置,然后根据情况确定是上浮还是下沉。

如何将数组建成堆:

我们从最后一个非叶子节点开始,一直到根节点,每个节点执行一次下沉操作,就可以建成堆。对于一个节点个数是n,根节点下标是1的完全二叉树,第一个非叶子节点的下标是n/2(下取整),也就是说我们将n/2到1的节点一次进行down操作即可。

上浮操作和下沉操作如何完成:

下沉操作:

我们将要下沉的节点和其左右儿子对比,如果有儿子小于它,这说明他需要down,则我们将其和最小的儿子交换,然后递归处理。

上浮操作:

给出两个操作的代码:

void down(int i)
{
    int t = i;
    if (i * 2 <= cnt && heap[i * 2] < heap[t])t = i * 2;
    if (i * 2 + 1 <= cnt && heap[i * 2 + 1] < heap[t])t = i * 2 + 1;
    if (heap[t] != heap[i]) {
        swap(heap[i], heap[t]);
        down(t);
    }
    return;
}


//不管是左儿子还是右儿子,除2向下取整都会得到根节点
void up(int i)
{
    int t = i;
    if (i / 2 >= 1 && heap[t] < heap[i / 2])t = i / 2;
    if (t != i) {
        swap(heap[t], heap[i]);
        up(t);
    }
    return;
}

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

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

相关文章

Axure原型创建折线、柱状等图形,引用echarts

1、在echarts网站选择对应的统计图形&#xff1a; 网址&#xff1a;Examples - Apache ECharts 2、对代码进行编辑&#xff0c;使其适配自己的业务。 3、在Axure中创建一个基本元件矩形。命名为&#xff1a;test 4、选择交互--载入时--打开连接--Fx 5、在插入变量中增加如下…

SVN windows安装及初步使用;及初次连接版本库、提交、还原、比对操作说明文档

派昂医药-SVN版本库说明总览&#xff1a; 1.说明 2.版本库地址 3.托管项目明细 4.SVN客户端安装 5.SVN-Win端版本操作 6.SVN客户端浏览 1.说明&#xff1a; <1、协议 SVN私有协议 <2、PC系统字符集要求 中文GBK编码&#xff1b;中文以外UTF-8编码&#xff0c;如乱码…

中国市场杂志社中国市场编辑部2022年第32期目录

前沿理论 新冠肺炎疫情下跨境冷链物流的新思考——以大连冷链业疫情为例 廖燕莲;谷玉红;尚书山; 1-3《中国市场》投稿&#xff1a;cnqikantg126.com 数字经济背景下数字服务税问题探析 李瑞玲; 4-6 我国工业能源效率提升的阻碍及其对策探究 韩洁平;田振东;张诗雅; …

DJ12-1 8086系列指令系统-2 数据传送指令

目录 1. 通用数据传送指令 &#xff08;1&#xff09;MOV 一般数据传送指令 &#xff08;2&#xff09;堆栈操作指令 &#xff08;3&#xff09;XCHG 交换指令 &#xff08;4&#xff09;XLAT 查表指令 &#xff08;5&#xff09;CBW 和 CWD 字位扩展指令 2. 输入输出指…

8点FFT实现全教程

个人认为编写8点FFT的编写,不要过分关注理论,重要的是理解整个流程。 参考文章: matlab 8点fft蝶形图,基2时抽8点FFT的matlab实现流程及FFT的内部机理_罗漫的博客-CSDN博客前言本来想用verilog描述FFT算法,虽然是8点的FFT算法,但写出来的资源用量及时延也不比调用FFT IP…

【第五部分 | JS WebAPI】5:1W字详解Bom对象

目录 | Bom概述 | window 、Bom、Dom 的关系 | window的load事件&#xff1a;把JS写进head里 如何把 JS 代码写到head里&#xff08;页面加载事件 onload&#xff09; 比onload更高效的加载事件 DOMContentLoaded | window的resize事件&#xff08;窗口大小改变的时候触发…

vue移动端高德地图的使用及实现最简单的地图功能

目录 一、创建应用获取key 1、进入开放平台&#xff0c;按步骤注册成为开发者 2、 登录之后&#xff0c;点击头像&#xff0c;进入「应用管理」 页面「创建新应用」 3、 为应用添加 Key 二、配置 1、在public下的index.html中添加 2、 JSAPI key和安全密钥的使用 方式一…

论文阅读09——《Deep Fusion Clustering Network》

论文阅读09——《Deep Fusion Clustering Network》 原文链接&#xff1a;论文阅读09——《Deep Fusion Clustering Network》 作者&#xff1a;Wenxuan Tu, Sihang Zhou, Xinwang Liu, Xifeng Guo, Zhiping Cai, En zhu, Jieren Cheng 发表时间&#xff1a;2021年5月18日 论文…

Java基础五大机制 —— SPI机制基础(一)

1、什么是SPI机制 SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;是JDK内置的一种 服务提供发现机制&#xff0c;可以用来启用框架扩展和替换组件&#xff0c;主要是被框架的开发人员使用&#xff0c;比如java.sql.Driver接口&#xff0c;其他不同厂商可…

Fast-DDS库的安装教程

Fast-DDS库的安装教程0 序言1 安装依赖2 安装Fast-DDS2.1 编译foonathan_memory_vendor2.2 编译Fast-CDR2.3 编译Fast-DDS2.4 编译Fast-DDS-Gen2.5 添加环境变量2.6 验证3 参考资料4 写在最后工欲善其事,必先利其器。首先要知道 Fast-DDS是什么&#xff1f;要知道 Fast-DDS是什…

wy的leetcode刷题记录_Day48

wy的leetcode刷题记录_Day48 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2022-11-21 前言 补前几天的blog 目录wy的leetcode刷题记录_Day48声明前言808. 分汤题目介绍思路代码收获654. 最大二叉树题目介绍思路代码收获808. 分汤 今…

Boc-QAR-AMC,CAS号:201849-55-0/113866-20-9

胰蛋白酶的高反应性底物&#xff0c;前列腺素和matriptase的荧关底物 编号: 199467中文名称: 标记肽Boc-QAR-7-氨基-4-甲基香豆素.HCl英文名: Boc-Gln-Ala-Arg-AMCCAS号: 201849-55-0/113866-20-9单字母: Boc-QAR-AMC三字母: Boc-Gln-Ala-Arg-AMC氨基酸个数: 3分子式: C29H42O8…

低代码维格云常用组件入门教程

1. 维格云常用组件功能简介 工作区的成员可以根据自己的业务习惯,将工作区内的应用、门户添加到常用组件。添加后成员可以直接从门户的常用组件中操作相应的应用、门户 2. 维格云常用组件配置方式 2.1 添加常用组件 在门户中拖拽或点击添加常用组件2.2 设置组件标题 在右侧编…

中学化学教学参考杂志社中学化学教学参考编辑部2022年第15期目录

刊庆专稿 试论“文化化学”教学思想的实践意义与样态 刘英琦; 1-4 课改在线《中学化学教学参考》投稿&#xff1a;cn7kantougao163.com 凝练观念 重构实践 引领评价——谈《义务教育化学课程标准(2022年版)》的修订 周青; 4-6 领悟化学课程的育人标准——基于《义务…

阿里、字节等神创,必须是全网最全的Netty核心原理手册

时间飞逝&#xff0c;转眼间毕业七年多&#xff0c;从事 Java 开发也六年了。我在想&#xff0c;也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试…

【SpringBoot笔记28】SpringBoot集成ES数据库之操作doc文档(创建、更新、删除、查询)

这篇文章&#xff0c;主要介绍SpringBoot集成ES数据库之操作doc文档&#xff08;创建、更新、删除、查询&#xff09;。 目录 一、SpringBoot操作ES文档数据 1.1、创建文档 1.2、更新文档 1.3、删除文档 1.4、查询文档 1.5、判断文档是否存在 1.6、批量创建文档 一、Spr…

高手系列!数据科学家私藏pandas高阶用法大全 ⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 数据分析实战系列&#xff1a;https://www.showmeai.tech/tutorials/40 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/394 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…

CubeMX+VSCode+Ozone的STM32开发工作流(二)VSCode环境配置

neozng1hnu.edu.cn 本教程的示例代码是笔者参加RoboMaster机甲大师赛为机器人编写的控制器框架&#xff0c;你可以直接克隆仓库&#xff0c;阅读仓库下的Markdown文档获得更好的体验&#xff0c;记得点一个小⭐: basic_framework: basic_framework (gitee.com)所有安装包也可以…

OceanBase TableAPI实践案例(Rust)

引子 这是OceanBase TableAPI实践案例&#xff08;Java&#xff09;的姊妹篇&#xff0c;上一篇比较全面的比较全面的介绍了TableAPI的相关概念&#xff0c;以及基本的环境搭建&#xff0c;因此这篇不再赘述。本文将主要介绍TableAPI的Rust客户端obkv-table-client-rs &#x…

Visio画图更改连接线的弧形和调整跨线

目录前言准备参考问题解决问题一解决问题二前言 最近在使用Visio画图时&#xff0c;出现了一些问题&#xff0c;于是上网查了一下&#xff0c;将方法记录下来。 准备 Visio2021 参考 Visio中&#xff0c;如何修改连接线的跨线样式&#xff1f; 问题 (1) 使用连接线的时候…