堆的深度剖析及使用

目录

  • 1.堆的创建
    • 1.1初始化
    • 1.2销毁
  • 2.堆的使用
    • 2.1数据插入
    • 2.2堆顶元素
    • 2.3数据删除
  • 3.堆的难点
    • 3.1向上调整
      • 3.1.1视频分析向上调整
      • 3.1.2 代码分析
    • 3.2向下调整
      • 3.2.1视频分析向下调整
      • 3.2.2代码分析

1.堆的创建

堆的物理储存方式其实是一个数组,而逻辑储存方式其实是一个完全二叉树(各各节点从上至下,从左至右依次紧密排列),因此我们可以创建一个结构体的指针指向二叉树的根节点,用数组来存储二叉树的节点。

typedef struct Heap
{HpDate* a;int size;int capacity;	
}HP;

1.1初始化

根据自己的选择可以先将数组a指向空,不开空间,后续插入数据时扩容,如果数据个数确定也可以先开部分空间后续不必扩容操作。

void HPInit(HP* hp)//初始化
{assert(hp);hp->a = NULL;hp->capacity = hp->size = 0;
}

1.2销毁

释放数组a的内存,将a的数据及空间清零以免内存泄漏。

void HPDestory(HP* hp)//销毁
{assert(hp);free(hp->a);hp->capacity = hp->size = 0;
}

2.堆的使用

2.1数据插入

注意事项:数据插入前判断数组空间是否足够(扩容一般二倍扩)

void HPPush(HP* hp, HpDate x)
{assert(hp);if (hp->capacity == hp->size)//插入数据前判断空间是否足够,不够则需要扩容{int newcapacity = hp->capacity == 0 ? 4 : 2 * hp->capacity;//创建新变量记录扩容前的空间大小,以免扩容失败导致原空间被改变HpDate* tmp = (HpDate*)realloc(hp->a, newcapacity * sizeof(HpDate));if (tmp == NULL)//扩容失败报错{perror("realloc faill");exit(1);}//扩容成功转移空间hp->a = tmp;hp->capacity = newcapacity;}hp->a[hp->size++] = x;//莫要忘记将数据个数++AdjustUp(hp->a, hp->size-1);//向上调整
}

2.2堆顶元素

直接返回数组的第一个元素

HpDate HPTop(HP* hp)
{assert(hp);return hp->a[0];
}

2.3数据删除

一般删除堆顶元素,也就是数组中最小的元素

void HPPop(HP* hp)
{assert(hp);swap(hp->a[0], hp->a[hp->size - 1]);hp->size--;AdjustDown(hp->a, 0,hp->size);//向下调整
}

3.堆的难点

3.1向上调整

插入数据后可能不满足小堆,而插入一般是尾插因此要向上调整堆。

3.1.1视频分析向上调整

请添加图片描述

3.1.2 代码分析

细节:在二叉树中左孩子=父亲2+1,右孩子=父亲2+2
如果插入的数据大于父亲或者调整至根(没有父亲)则停止调整。

        //可以传入HP* a而只传入数组只是为了可以供数组的单独使用
void AdjustUp(HpDate* a, HpDate child)//向上调整
{int parent = (child - 1) / 2;while (parent >= 0 && a[parent] > a[child]){swap(a[parent], a[child]);child = parent;parent= (child - 1) / 2;}
}

3.2向下调整

3.2.1视频分析向下调整

请添加图片描述

3.2.2代码分析

          //可以传入HP* a而只传入数组只是为了可以供数组的单独使用
void AdjustDown(HpDate* a, HpDate parent,int n)//向下调整
{int child = parent * 2 + 1;//可以先假设左孩子小if (child + 1 < n && a[child + 1] < a[child])//容易遗漏,不要越界child++;while (a[parent] > a[child]&& child < n){swap(a[parent], a[child]);parent = child;child = parent * 2 + 1;if (child + 1 < n && a[child + 1] < a[child])//容易遗漏,不要越界child++;}
}

向下调整的前提
请添加图片描述

请添加图片描述

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

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

相关文章

Hu矩原理 | cv2中基于Hu矩计算图像轮廓相似度差异的函数cv2.matchShapes【小白记笔记】

Hu 矩&#xff08;Hu Moments&#xff09; 是一种用于描述轮廓形状的 不变特征。它基于图像的矩提取&#xff0c;经过数学变换得到 7 个不变矩&#xff0c;这些不变矩在图像 平移、旋转和缩放等几何变换下保持不变&#xff0c;适合用来衡量轮廓或形状的相似度差异。 1、图像矩…

计算无人机俯拍图像的地面采样距离(GSD)矩阵

引言 在无人机遥感、测绘和精细农业等领域&#xff0c;地面采样距离&#xff08;Ground Sampling Distance&#xff0c;简称 GSD&#xff09;是一个非常重要的指标。GSD 是指图像中每个像素在地面上实际代表的物理距离&#xff0c;通常以米或厘米为单位。GSD 决定了图像的空间…

浅谈怎样系统的准备前端面试

前言 创业梦碎&#xff0c;回归现实&#xff0c;7 月底毅然裸辞&#xff0c;苦战两个月&#xff0c;拿到了美团和字节跳动的 offer&#xff0c;这算是从业以来第一次真正意义的面试&#xff0c;遇到蛮多问题&#xff0c;比如一开始具体的面试过程我都不懂&#xff0c;基本一直是…

深度学习-74-大语言模型LLM之基于API与llama.cpp启动的模型进行交互

文章目录 1 大模型量化方法1.1 GPTQ(后训练量化)1.2 GGUF(支持CPU)1.3 AWQ(后训练量化)2 llama.cpp2.1 功能2.1.1 Chat(聊天)2.1.2 Completion(补全)2.2 运行开源LLM2.2.1 下载安装llama.cpp2.2.2 下载gguf格式的模型2.2.3 运行大模型3 API访问3.1 调用补全3.2 调用聊天3.3 提取…

sql server 字符集和排序

英文&#xff1a; Latin1_General_CI_AS 中文&#xff1a;Chinese_PRC_CI_AS 影响字符存储&#xff0c;解释用户存在单字节字符类型&#xff08;char&#xff0c;varchar等&#xff09;里面的数据 字符排序规则&#xff08;是否区分大小写等&#xff09; 中国的用户一定要注意…

【docker】列出与特定镜像名相关的镜像

目录 1. 说明2. 列出所有镜像3. 使用镜像名过滤4. 列出特定标签的镜像5. 结合多个过滤条件6. 使用 JSON 格式和 jq 工具 1. 说明 1.在 Docker 中&#xff0c;如果你想列出与特定镜像名相关的镜像&#xff0c;可以使用 docker images 命令并结合过滤选项&#xff08;如 --filte…

Elasticsearch 实战应用:开启数据搜索与分析新征程

在当今信息爆炸的时代&#xff0c;高效的数据搜索与分析能力成为众多企业和开发者追求的目标。Elasticsearch 作为一款强大的分布式搜索和分析引擎&#xff0c;正逐渐成为数据处理领域的核心工具之一。在我们的教学过程中&#xff0c;旨在让学生深入理解并熟练掌握 Elasticsear…

Navicat 17 功能简介 | SQL 美化

SQL美化 本期&#xff0c;我们将深入挖掘 Navicat 的实用的SQL代码美化功能。你只需简单地点击“SQL 美化”按钮&#xff0c;即可轻松完成 SQL 的格式化。 随着 17 版本的发布&#xff0c;Navicat 也带来了众多的新特性&#xff0c;包括兼容更多数据库、全新的模型设计、可视化…

2009 ~ 2019 年 408【数据结构】大题解析

2009 年 讲解视频推荐&#xff1a;【BOK408真题讲解-2009年&#xff08;催更就退网版&#xff09;】 1. 图的应用&#xff08;10’&#xff09; 带权图&#xff08;权值非负&#xff0c; 表示边连接的两顶点间的距离&#xff09;的最短路径问题是找出从初始顶点到目标顶点之间…

时空AI赋能低空智能科技创新

随着人工智能技术的不断进步&#xff0c;时空人工智能&#xff08;Spatio-Temporal AI&#xff0c;简称时空AI&#xff09;正在逐渐成为推动低空经济发展的新引擎。时空AI结合了地理空间智能、城市空间智能和时空大数据智能&#xff0c;为低空智能科技创新提供了强大的数据支持…

SamOut 任意长度推理空间不变

项目地址 import numpy as np import pandas as pd import torch from tqdm import tqdmfrom infer_model import SamOutdef load_model_and_voc(device"cpu"):voc pd.read_pickle("total_voc.pkl")net SamOut(len(voc["voc"]), 1024 512, 64…

17.springcloud_openfeign之扩展组件一

文章目录 一、前言二、默认约定配置FeignAutoConfigurationCachingCapabilityFeignCachingInvocationHandlerFactoryFeignJacksonConfiguration熔断器配置FeignCircuitBreakerTargeterFeignCircuitBreaker.Builder FeignClientsConfigurationCircuitBreakerFactory 总结 一、前…

Python读取Excel批量写入到PPT生成词卡

一、问题的提出 有网友想把Excel表中的三列数据&#xff0c;分别是&#xff1a;单词、音标和释义分别写入到PPT当中&#xff0c;每一张PPT写一个单词的内容。这种批量操作是python的强项&#xff0c;尤其是在办公领域&#xff0c;它能较好地解放双手&#xff0c;读取Excel表后…

Proteus(8.15)仿真下载安装过程(附详细安装过程图)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Proteus是什么&#xff1f; 二、下载链接 三、下安装步骤 1.解压&#xff0c;有键管理员运行 2.点击Next&#xff0c;进行下一步 3.勾选I accept…&#…

防止私接小路由器

电脑获取到IP地址不是DHCP服务器的IP地址段&#xff0c;导致整个公司网络瘫痪&#xff0c;这些故障现象通常80%原因是私接小路由器导致的&#xff0c;以下防止私接小路由器措施。 一、交换机配置DHCP Sooping DHCP snooping是一种DHCP安全特性&#xff0c;用于防止非法设备获…

动态导出word文件支持转pdf

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、功能说明二、使用步骤1.controller2.工具类 DocumentUtil 导出样式 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff…

紧固件设计之——开槽六角头防脱出杆螺栓仿真APP

按照产品形态分类&#xff0c;紧固件通常包括以下12类&#xff1a;螺栓、螺柱、螺钉、螺母、自攻螺钉、木螺钉、垫圈、挡圈、销、铆钉、焊钉、组合件与连接副&#xff0c;是一类用于连接和固定各种构件和零部件的重要机械零件&#xff0c;可确保机械装置或设备结构的牢固和稳定…

【Python装饰器】编写一个装饰器,并将其放到适当的位置,目的是让代码 1 秒钟打印一个结果

import timedef fib():back1, back2 0, 1def func():nonlocal back1, back2back1, back2 back2, back1 back2print(back1, end )return funcdef get_fib(n):f fib()for i in range(n):f()n int(input("请输入需要获取的斐波那契数&#xff1a;"))get_fib(n) imp…

mysql中与并发相关的问题?

今天我们来聊聊 MySQL 中与并发相关的一些问题。作为一名资深 Python 开发工程师&#xff0c;我觉得这些问题不仅关乎数据库的稳定性和数据的一致性&#xff0c;更与我们的代码实现和业务逻辑密切相关。 尤其是在高并发环境下&#xff0c;如何保证数据的一致性&#xff0c;如何…

【Mac】安装 PaddleOCR

环境&#xff1a;Mac M1 芯片 1、安装 Anaconda 安装较为简单&#xff0c;直接在 Anaconda 官网 下载pkg文件&#xff0c;根据向导提示完成安装。 Anaconda 用于搭建 Python 虚拟环境&#xff0c;目的是为了避免与之前环境安装库的版本冲突&#xff0c;另外 paddle 对Python…