堆的数据结构以及堆的相应操作

堆的定义

二叉树中的堆使用顺序存储的结构来进行存储这里的堆指代的是一种数据结构

在一个关键码存在的集合中K = {K1,K2,K3,....,Kn},把它的所有元素按照完全二叉树的顺序存储方式,存储在一个一维数组中,如果根结点的元素值大于其左右孩子的值,并且每个子树都满足这种情况,其对应的堆,我们称为最大堆

堆的相关操作

//Heap.h#pragma once
#include<iostream>
#include<stdlib.h>
#include<stdbool.h>
using namespace std;#pragma region 定义堆的存储结构
typedef int HeapDataType;
/*定义哨兵*/
#define MAXDATA 0xfffff
typedef struct HNode* heap;
typedef heap MaxHeap;/*MaxHeap==Heap==HNode  所以MaxHeap是指针类型*/
typedef struct HNode
{HeapDataType* HeadData;/*指针用来指向数据存储的空间*/int sizes;/*当前堆的存储的数据的个数*/int capacity;/*堆所满足的最大的容量*/
};
#pragma endregion
/*堆的创建*/
MaxHeap/*此时实际上返回的是HNode*/ CreatHeap(int MaxSize);
/*堆的销毁*/
void DestoryHeap(MaxHeap M_hp);
/*堆的插入*/
MaxHeap InsertHeap(MaxHeap Mhp, HeapDataType* item);
/*堆的删除*/
MaxHeap DeleteHeap(MaxHeap Mhp);
/*创建最大堆*/
void MoveDown(MaxHeap Mhp, int length);
/*判断堆是否已满*/
bool IsFull(MaxHeap Mhp);

堆的具体实现的CPP程序

#include"Heap.h"
/*创建具有MaxSize容量的最大堆*/
MaxHeap/*此时实际上返回的是HNode*/ CreatHeap(int MaxSize)
{MaxHeap Heap = NULL;Heap = (MaxHeap)malloc(sizeof(HNode));Heap->HeadData = (HeapDataType*)malloc(sizeof(HNode)*(MaxSize + 1));Heap->capacity = MaxSize;Heap->sizes = 0;Heap->HeadData[0] = MAXDATA;return Heap;
}
#pragma region 销毁最大堆
void DestoryHeap(MaxHeap Mhp)
{if (Mhp == NULL){return;}delete[] Mhp->HeadData;Mhp->HeadData = NULL;Mhp->capacity = 0;Mhp->sizes = 0;
}
#pragma endregion
#pragma region 最大堆元素的插入
void SWAP(HeapDataType item_1, HeapDataType item_2)
{HeapDataType tmpstore;tmpstore = item_1;item_1 = item_2;item_2 = item_1;
}
MaxHeap InsertHeap(MaxHeap Mhp, HeapDataType* item)
{if (Mhp == NULL || item == NULL){return false;/*输入的数据不符合要求*/}MaxHeap tmphp = NULL;tmphp = Mhp;/*判断是否满了*/if (tmphp->sizes == tmphp->capacity){cout << "该堆结构存储空间已满" << endl;return false;}tmphp->HeadData[tmphp->sizes + 1] = *item;/*将元素首先放在尾部*/int childPos = tmphp->sizes + 1;int parentPos = childPos / 2;while (tmphp->HeadData[childPos] > tmphp->HeadData[parentPos])/*证明插入数据大于根节点的数据*/{SWAP(tmphp->HeadData[childPos], tmphp->HeadData[parentPos]);childPos = parentPos;parentPos = childPos / 2;}tmphp->sizes++;return tmphp;
}
#pragma endregion
#pragma region 最大堆元素的删除
MaxHeap DeleteHeap(MaxHeap Mhp)
{if (Mhp == NULL || Mhp->sizes == 0){cout << "堆为空" << endl;return NULL;}MaxHeap tmphp = NULL;tmphp = Mhp;int parent = 1;int child = 2 * parent + 1;while (child<=tmphp->sizes){if ((child+1<=tmphp->sizes)/*右孩子存在*/ && (tmphp->HeadData[child]<tmphp->HeadData[child+1]/*选择孩子中的最大一个*/) ){child = child + 1;/*先找到符合条件的child的位置*/}/*交换*/if (tmphp->HeadData[parent]<tmphp->HeadData[child]){SWAP(tmphp->HeadData[parent], tmphp->HeadData[child]);parent = child;child = 2 * parent + 1;}else{break;}}tmphp->sizes--;return tmphp;
}
#pragma endregion
#pragma region 创建最大堆
void MoveDown(MaxHeap Mhp, int length)
{if (Mhp == NULL || length == 0){cout << "输入的堆的元素为空" << endl;return;}MaxHeap tmphp = NULL;tmphp = Mhp;int parent = length;int child = 2 * length + 1;while (child <=tmphp->sizes)/*防止左孩子出界*/{if ((child+1<=tmphp->sizes) && (tmphp->HeadData[child]<=tmphp->HeadData[child+1])){/*右孩子更大*/child = child + 1;/*将更换的位置调整为右孩子*/}/*判断父结点位置的元素是否比孩子结点的小*/if (tmphp->HeadData[parent]<tmphp->HeadData[child]){SWAP(tmphp->HeadData[parent], tmphp->HeadData[child]);parent = child;child = 2 * parent + 1;}else{break;}}
}
MaxHeap CreatMaxHeap(MaxHeap Mhp)
{int length = Mhp->sizes/2;MaxHeap tmphp = NULL;tmphp = Mhp;/*首先找到具有最后一个结点的孩子*/for (length;length>0;length--){MoveDown(tmphp, length);}return tmphp;
}
#pragma endregion
#pragma region 判断堆满情况
bool IsFull(MaxHeap Mhp)
{if (Mhp->sizes == Mhp->capacity){return true;}return false;
}
#pragma endregion

这里需要明确:给定一组数据,利用大根堆的方式存储,具体步骤:

  • > 首先寻找到具有最后一个顺序存储的叶子结点的父亲结点,开始实现自后向前的遍历
  • 遍历的每一个结点都实现基于大根堆的大数据向上移动而小数据向下move down的策略 。所以,有了一种针对每个结点都重复一次操作的实现过程。

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

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

相关文章

关节点检测

https://www.bilibili.com/video/BV19g4y1777q/?p2&spm_id_frompageDriver 关节点检测全流程 YOLO:单阶段&#xff0c;快&#xff1b; MMPose&#xff1a;双阶段&#xff0c;准&#xff1b; 标注工具Labelme 用Labelme标注样本数据集

方格定位1_题解

【题解提供者】吴立强 解法 思路 将原数减 1 后看作是四进制数&#xff0c;那么十位代表的就是所在行号减 1 的值&#xff0c;个位代表的就是所在列号减 1 的值。 代码展示 #include <iostream> using namespace std;int main() {int n; cin >> n;int h (n …

MongoDB聚合: $sortByCount

$sortByCount聚合根据指定表达式的值对输入文档进行分组&#xff0c;然后计算每个不同分组中的文档数。 每个输出文档包含两个字段&#xff1a;一个是包含不同分组值的_id字段&#xff0c;另一个是包含属于该分组或类别的文档数量的计数字段。 文档按计数降序排序。 语法 {…

常用的文件系统、存储类型小整理

最近接触到了五花八门的文件系统、存储类型&#xff0c;名词听得头大&#xff0c;趁假期整理学习一番~ 名称OSSFastDFSJuiceFSCIFSCephFSEFSNFS全称Object Storage Service (对象存储服务)Fast Distributed File System (快速分布式文件系统)Juice File System (Juice 文件系统…

电脑通电自启动设置

首先要进入BIOS&#xff0c;以华硕为例&#xff0c;按下电源键&#xff0c;在开机之前按下delete键&#xff0c;其他电脑可能是esc或者某个f键&#xff0c;请自行查找。 进入BIOS后要找到电源管理&#xff0c;可以在高级选项中找一找&#xff0c;如上图右下角选择高级模式。 …

Golang 基础 环境配置和包管理

Golang 基础环境和语法 交叉编译 windows 下打包 linux 的运行程序。 设置变量 set GOARCHamd64 set GOOSlinuxgo build取消变量 set GOARCH set GOOS显示变量 set GOgo test 当go test以包列表模式运行时&#xff0c;go test会缓存成功的包的测试结果以避免不必要的重复…

PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证

文章目录 Openssl操系统默认的CA证书的公钥位置Nginx Https 自签证书Nginx Https 使用CA签发证书客户端使用自签证书供服务端验证客户端使用 根证书 签发客户端证书 供服务端验证 Openssl https://www.openssl.net.cn/ openssl是一个功能丰富且自包含的开源安全工具箱。 它提…

2024腾讯云游戏服务器租用多少钱一年?

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

(44)公因子的数目

文章目录 每日一言题目解题思路法一:法二&#xff1a; 代码法一:法二&#xff1a; 结语 每日一言 懒惰行动得如此缓慢&#xff0c;贫穷很快就能超过它。——富兰克林 题目 题目链接&#xff1a;公因子的数目 给你两个正整数 a 和 b &#xff0c;返回 a 和 b 的 公 因子的数目…

在centos7中利用pybind11构建C++的动态库供python调用

在centos7中利用pybind11构建C的动态库供python调用 步骤 1&#xff1a;安装依赖步骤 2&#xff1a;获取 pybind11 头文件步骤 3&#xff1a;编写绑定代码步骤 4&#xff1a;编译动态库步骤 5&#xff1a;在 Python 中调用编译命令解释注意 需求&#xff1a;在 CentOS 7 中&…

Python - 构建多语言情感分析应用

在开发使用 Flask 构建的 Web 应用时,有时需要处理不同语言的情感分析。这个示例将展示如何同时处理英文和中文文本的情感分析,并使用 TextBlob 和 SnowNLP 这两个库实现。 英文情感分析 首先,我们有一个名为 __init__.py 的 Flask 应用处理英文情感分析。它接收 POST 请求…

画出TCP三次握手和四次挥手的示意图,并且总结TCP和UDP的区别

三次握手 第一次握手&#xff1a;客户端发送SYN包&#xff08;SYN1, seq0&#xff09;给服务器&#xff0c;并进入SYN_SENT状态&#xff0c;等待服务器返回确认包。第二次握手&#xff1a;服务器接收到SYN包&#xff0c;确认客户端的SYN&#xff0c;发送ACK包&#xff08;ACK1 …

在虚拟机上搭建CentOS环境并配置静态IP

在虚拟机上搭建CentOS环境并配置静态IP 在进行Linux系统的学习和实践时&#xff0c;搭建一个本地的CentOS环境是一个非常好的方式。本文将介绍如何使用虚拟机&#xff08;VM&#xff09;搭建CentOS环境&#xff0c;并配置静态IP&#xff0c;以便更好地进行网络管理和测试。 步…

项目学习记录

项目开发 创建项目环境配置关联git新增模块项目启动打印地址日志使用httpclient进行idea内部控制台测试使用AOP拦截器打印日志 创建项目 创建一个空项目&#xff0c;并勾选下面选项 然后进入pom.xml中修改项目配置 根据这个链接选则&#xff0c;修改项目的支持版本 链接&#…

TCP和UDP相关问题(重点)——7.TCP的流量控制怎么实现的?

流量控制就是在双方通信时&#xff0c;发送方的速率和接收方的速率不一定是相等的&#xff0c;如果发送方发送的太快&#xff0c;接收方就只能把数据先放到接收缓冲区中&#xff0c;如果缓冲区都满了&#xff0c;那么处理不过来就只能丢弃&#xff0c;所以需要控制发送方的速率…

供应链|Managemeng Science 论文解读:数据驱动下联合定价和库存控制的近似方法 (一)

编者按 本次解读的文章发表于 Management Science&#xff0c;原文信息&#xff1a;Hanzhang Qin, David Simchi-Levi, Li Wang (2022) Data-Driven Approximation Schemes for Joint Pricing and Inventory Control Models. https://doi.org/10.1287/mnsc.2021.4212 文章在数…

精通Python爬虫:掌握日志配置

源码分享 https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tabBB08J2 在开发Python爬虫时&#xff0c;日志记录是一个不可或缺的特性&#xff0c;它帮助我们捕捉运行时信息、调试代码和监控爬虫的健康状况。合理地配置日志系统是提高爬虫可维护性的关键。本篇技术博客将详细介绍…

测试管理_利用python连接禅道数据库并自动统计bug数据到钉钉群

测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述&#xff0c;直接上代码文件。 另文章基础参考博文&#xff1a;参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…

闭区间上连续函数的性质【高数笔记】

1. 分几个性质 2. 每个性质的注意事项是什么 3. 每个性质适用什么类型的题型 4. 注意最值定理和正弦函数的不同 5. 做题步骤是什么

Web前端框架-Vue(初识)

文章目录 web前端三大主流框架**1.Angular****2.React****3.Vue**什么是Vue.js 为什么要学习流行框架框架和库和插件的区别一.简介指令v-cloakv-textv-htmlv-pre**v-once**v-onv-on事件函数中传入参数事件修饰符双向数据绑定v-model 按键修饰符自定义按键修饰符别名v-bind(属性…