news 2026/5/4 8:19:41

堆的定义与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
堆的定义与实现

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、堆的定义
  • 二、堆的实现
    • 1.大/小堆的构建
    • 2.堆的增删查

前言


一、堆的定义

结构基础:堆是基于完全二叉树的逻辑结构,用数组来物理实现。

核心性质:堆可分为大堆和小堆。
其中,大堆要求每个子树的父节点>=左右子节点。
小堆要求每个子树的父节点 <= 左右子节点。

//堆用C实现typedefintHPDataType;typedefstructHeap{HPDataType*_a;//堆元素的存放数组int_size;//有效元素个数int_capacity;//容量}Heap;

二、堆的实现

为什么堆可以用数组来实现?

因为数组可以实现快速的随机访问,操作更加简单。再加上完全二叉树不会浪费很多数组的空间。

1.大/小堆的构建

(以小堆为例)
为了让最小的数在堆顶,其余的小数都在其子树的父亲节点。
要用到“向下调整”的算法。来调整根节点和两子树的关系,是根保持为最小。

当parent = n, 左 child = 2 * n + 1, 右child = 2 * n + 2 基于数组实现的索引规律
//参数分别为 堆中元素(数组),元素总个数,需要向下调整的父亲节点voidAdjustdowm(HPDataType*a,intn,introot){intparent=root;intchild=2*parent+1;//先假设左孩子while(child<n)//结束条件:孩子节点不能大于总数{if(child<n&&a[child]>a[child+1]){child++;//右孩子小,使child走到右孩子}//如果孩子节点小于父亲节点if(a[child]<a[parent]){swap(&a[child],&a[parent]);parent=child;child=parent*2+1;}else{break;}}}

但向下调整的前提是单前节点的左右子树都是(小)堆,才能保证拿上来的是最小值。
所以要从最后一个节点的父亲节点开始向下调整,由下到上。

当孩子child = n时,parent = (n-1) /2 最后一个孩子是n-1, 得出最后一个父亲是(n-1-1)/2
//构建堆——以小堆为例for(inti=(n-1-1)/2;i>=0;i--)//从最后一个节点的父亲节点开始,从下往上才能保证左右子树都是小堆{AdjustDown(hp->_a,hp->_size,i);}

2.堆的增删查

如何在堆中增加一个数,而不破坏小堆的形式?
先把数据加在末尾,再使用向上调整算法,使数据到合适的地方。

//向上调整---(以小堆为例)AdjustUp(HPDataType*a,intn,intchild){intparent=(child-1)/2;while(child>0)//当child = 0时,才算调整完{if(a[child]<a[parent]){swap(&a[child],&a[parent]);child=parent;parent=(child-1)/2;}else{break;}}}

增加一个元素

// 堆的插入voidHeapPush(Heap*hp,HPDataType x){//插入时只能先在末尾插入,再调整到堆中合适的地方if(hp->_size==hp->_capacity){hp->_capacity*=2;HPDataType*tmp=(HPDataType*)realloc(hp->_a,sizeof(HPDataType)*hp->_capacity);if(tmp!=NULL){hp->_a=tmp;}else{printf("扩容失败");}}hp->_a[hp->_size++]=x;//需要将插入值向上调整AdjustUp(hp->_a,hp->_size,hp->_size-1);}

删堆顶的数据,是先将堆顶与数组最后一个元素交换,再删除最后一个元素,将新元素向下调整。
因为最后一个元素方面删除。

// 堆的删除——(肯定删的是堆顶的数据)voidHeapPop(Heap*hp){intend=hp->_size-1;if(end<0){return;}else{swap(&hp->_a[0],&hp->_a[end]);hp->_size--;AdjustDown(hp->_a,hp->_size,0);}}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 14:13:42

AI Agent在企业数字化转型中的关键角色与实施策略

AI Agent在企业数字化转型中的关键角色与实施策略 关键词:AI Agent、企业数字化转型、关键角色、实施策略、智能自动化 摘要:本文深入探讨了AI Agent在企业数字化转型中的关键角色与实施策略。首先介绍了相关背景,包括目的范围、预期读者等。接着阐述了AI Agent的核心概念、…

作者头像 李华
网站建设 2026/4/21 11:58:10

LoRA技术详解:从矩阵变换到权重冻结的完整流程(值得收藏)

LoRA是一种高效的大模型微调技术&#xff0c;通过冻结原始权重&#xff0c;仅训练低秩矩阵A和B&#xff0c;实现参数压缩比256:1以上的高效适配。其核心原理是将权重更新量ΔW分解为两个低秩矩阵的乘积(BA)&#xff0c;在不增加推理延迟的前提下&#xff0c;聚焦任务特定特征。…

作者头像 李华
网站建设 2026/5/2 23:05:36

CTF比赛解题技巧:新手解题从哪下手?全是实战技巧手册!

CTF解题宝典&#xff1a;可复制的思维框架技巧模板&#xff0c;新手直接套用拿分&#xff0c;建议收藏学习 本文为CTF初学者提供系统化解题框架&#xff0c;从通用黄金流程(审题、信息收集、工具匹配)到各题型具体技巧&#xff0c;详细介绍了Web、密码学、Misc和逆向四大类题目…

作者头像 李华
网站建设 2026/4/30 9:39:12

网安科普】CTF网络安全比赛介绍,带你手把手了解

【网安科普】CTF网络安全比赛介绍&#xff0c;带你手把手了解 01 CTF的起源 CTF全称Capture The Flag&#xff0c;CTF的前身是传统黑客之间的网络技术比拼游戏&#xff0c;起源于 1996 年第四届 DEFCON。 早期CTF竞赛 第一个 CTF 比赛&#xff08;1996 年 - 2001 年&#x…

作者头像 李华
网站建设 2026/5/3 17:15:02

计算机专业在校生必看!网安方向求职铺垫全攻略:护网、重点拆解

计算机专业在校生必看&#xff01;网安方向求职铺垫全攻略&#xff1a;护网、重点拆解CTF与实战路径&#xff01; 计算机大学生要怎么确定以后的方向&#xff1f;在校生的核心优势就是时间自由&#xff0c;只要找对方向 —— 自学技术打基础、CTF 比赛练实战、护网行动攒经验&a…

作者头像 李华