数据结构--堆的向上调整和向下调整

文章目录

  • 1.完全二叉树
  • 2.堆向上调整
  • 3.堆向下调整
  • 4.测试代码

1.完全二叉树

下面的这个就是对于我们的完全二叉树的这个逻辑结构和物理结构的说明:

逻辑结构就是我们自己认为的进行购想出来的;

但是这个物理结构却是我们的这个数据结构在内存里面的真是进行存储的这个形态的一个体现;

1)通过下面的这个图片,我们首先需要知道这个完全二叉树的定义,其实下面的这个实例很特殊,它既是一个完全二叉树,也是一个满二叉树;

2)我们的这个完全二叉树它的定义就是他的这个所有的节点进行编号和我们的这个满二叉树是一样的,这个时候我们就把这个树称之为完全二叉树;

3)下面的这个满二叉树实际上就是一个完全二叉树;

4)我们可以看到这个完全二叉树在我们的这个内存里面实际上是使用这个数组进行存储的,但是我们在学习这个数据结构的时候,使用的是他的逻辑结构,也就是二叉树;

在这里插入图片描述

2.堆向上调整

这个主要是我们的建堆的过程,就是我们进行建堆的时候,这个数据从我们的叶子结点开始需要进行这个向上调整的过程;

在这里插入图片描述

我们从上面的这个建堆的过程是可以看到的,他是需要和自己的这个父亲节点不断地进行比较,直到他的数值比父亲节点的数值小,这个大堆才完成;

我们的建堆主要是在下面的这个插入数据的过程里面使用的:我们首先就是进行的这个空间的开辟,最后是调用我们的这个向上调整的函数,这个就是说:我们的这个向上调整就是进行插入的时候保证我们的这个大堆的结构(就是我们插入数据之后,他还是一个堆);在这里插入图片描述
下面的这个:我们的这个child参数就是我们插入的数据,我们的这个函数就是对于这个数据的位置进行调整,使用这个父子节点的关系,我们根据这个子节点的小标,找到这个parent节点的大小;

如果我们的这个儿子数值比我们的这个父亲大,这个时候就是需要向上进行调整的,我们的这个调整的方法就是先交换,交换之后让我们的这个儿子向上走(也就是代码里面的这个child=parent);

我们的这个child向上之后,这个对应的这个parent也就是需要发生变化的,这个变化就是把我们的这个child-1/2之后的值作为新的这个parent节点的下标;

在这里插入图片描述

我们如何去验证这个调整的结果是否正确:我们去进行这个堆的初始化,向这个里面进行我们的数据的插入,这个时候断掉调试,hp.a,6----这个就会显示我们的这个数组里面的6个元素的位置,我们根据这个调试的结果做出来这个对应的树,这个时候发现我们插入数据之后,这个最后的解构就是一个大根堆(如图所示);
在这里插入图片描述

3.堆向下调整

这个向下调整是如何引出来的,就是我们的这个数据进行插入之后,这个时候我们的大堆的结构就形成了,这个时候我们的这个父亲节点肯定就是最大的这个元素,这个时候,我们的处理就是想要知道这个第二大的元素(这个过程实际上就是我们堆排序的雏形,但是这个并不是真正的堆排序);

我们去掉这个父亲节点之后,想要直到这个第二大的元素是哪一个,并且去掉这个父亲节点之后的这个树的结构又是什么样子的,这个时候有些人的方案就是:

1)这个完全二叉树不就是一个数组吗,我们的这个父亲节点就是这个数组里面的第一个元素,这个时候我们直接把这个后面的所有的元素向前移动不就可以了;

2)但是上面的这个方案是不可取的,主要是因为我们如果使用上面的这个方式进行调整,我们的这个数据之间的这个父子关系就完全发生了变化,因此我们否定这个解法;

3)正确的解法就是我们让这个父亲节点和我们的这个最后的这个节点进行交换,直接使用我们的这个pop删除这个最后的元素,这个时候原本的最后的一个元素放到了根节点的位置,其他的所有的元素的位置都是不变的,这样可以维持我们的这个数据之间的这个父子的关系;

4)但是现在他是不符合我们的大根堆的定义的,因此这个时候我们的处理就是让这个元素向下进行比较,不断的向下调整-----------这个就是我们的向下调整的这个出现的场景;

下面的这个就是我们进行pop操作的时候,我们需要交换之后size–就可以了,然后我们对于这个时候的0下标的位置的元素向下调整;

在这里插入图片描述

这个时候我们的方法就是需要找到这个时候的两个儿子里面的最大的那个元素:也就是和我们的这个父亲节点相邻的两个孩子,找到他们里面的较大的一个,如果我们比这两个里面的较大的一个小,这个时候我们就是需要进行调整的,这个里面的child+1<N是为了防止越界;

这个while控制的是我们的这个比较的过程是不是到达了根节点,第一个if是默认我们的这个左边的孩子是最大的,如果发现是这个右边的比左边的大,我们的这个child++,同时如果出现了这个只有左边的孩子,没有右边的孩子,这个时候child+1就会越界,因此我们使用这个child+1防止越界;在这里插入图片描述

下面的这个就是我们的4和17里面的这个较大的就是17,因此我们的这个3就需要和我们的17进行比较,这个时候发现是不满足我们的这个大根堆的定义的,因此这个就需要向下调整:

child的值赋值给我们的parent,这个时候新的child就是我们这个时候的parent*2+1即可;

在这里插入图片描述

4.测试代码

这个时候,我们既可以随机的插入数据,打印这个大堆的结果;

我们也可以插入很多的数据,使用这个k限制,打印出来有限多个数据,两个方式都是可以的;

这个时候,我们既可以随机的插入数据,打印这个大堆的结果;

我们也可以插入很多的数据,使用这个k限制,打印出来有限多个数据,两个方式都是可以的;
在这里插入图片描述

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

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

相关文章

智能挂号系统设计典范:SSM 结合 Vue 在医院的应用实现

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了医院预约挂号系统的开发全过程。通过分析医院预约挂号系统管理的不足&#xff0c;创建了一个计算机管理医院预约挂号系统的方案。文章介绍了医院预约挂号系统的系…

Transform组件的用法

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Checkbox Widget相关的内容,本章回中将介绍Transform Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的Transform是一种容器类widget,它和Container组件类似。它可以包含其它的组件…

go面试问题

1 Go的内存逃逸如何分析 go build -gcflags-m main_pointer.go 2 http状态码 300 请求的资源可包括多个位置&#xff0c;相应可返回一个资源特征与地址的列表用于用户终端&#xff08;例如&#xff1a;浏览器&#xff09;选择 301 永久移动。请求的资源已被永久的移动到新U…

TouchGFX移植(5)增加触屏驱动

一&#xff09;增加驱动代码gt9xxx.c和ctiic.c到工程中的BSP目录下: 二&#xff09;更改触摸文件STM32TouchController.cpp 1&#xff09;在STM32TouchController.cpp文件中增加&#xff1a; #include “gt9xxx.h” 2&#xff09;增加gt9xxx_init(); void STM32TouchControlle…

资源型数字化平台该如何顺利运营?

一、引言 随着信息技术的迅猛发展&#xff0c;资源型数字化平台在各领域的重要性日益凸显。此类平台整合各类资源&#xff0c;以数字化手段提升资源利用效率与价值&#xff0c;但确保其顺利运营面临诸多挑战。 二、资源型数字化平台特点 资源型数字化平台具有资源整合性&…

GitLab的安装和使用

1.GitLab 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能…

Leetcode 串联所有单词的子串

算法思想&#xff08;中文解释&#xff09; 这道题目要求我们在字符串 s 中找到所有子串&#xff0c;这些子串是字符串数组 words 中所有单词的串联&#xff0c;并且每个单词只能使用一次&#xff0c;且顺序可以任意。下面是代码的算法思想&#xff1a; 1. 核心思路 分解问题…

解析在OceanBase创建分区的常见问题|OceanBase 用户问题精粹

在《分区策略和管理分区计划的实践方案》这篇文章中&#xff0c;我们介绍了在ODC中制定分区策略及有效管理分区计划的经验。有不少用户在该帖下提出了使用中的问题&#xff0c;其中一个关于创建分区的限制条件的问题&#xff0c;也是很多用户遭遇的老问题。因此本文以其为切入&…

有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?

想找个 “免费” 的 ERP 软件&#xff1f; 咱得知道&#xff0c;ERP 那可是涉及财务、人力、供应链、采购、销售等好多方面的重要企业软件。功能这么全&#xff0c;能免费才怪呢&#xff01;真要是有免费的&#xff0c;早就火遍大江南北&#xff0c;说不定把市场都垄断了&…

centos-stream9系统安装docker

如果之前安装过docker需要删除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安装yum-utils工具&#xff1a; dnf -y install yum-utils dnf-plugin…

了解cuda的统一内存

1. CUDA 6中的统一内存 在CUDA 6中&#xff0c;从Kepler GPU架构&#xff08;计算能力3.0或更高&#xff09;开始&#xff0c;在64位Windows 7、8和Linux操作系统&#xff08;内核2.6.18&#xff09;上开始支持统一内存. 从CUDA 6开始&#xff0c;NVIDIA推出了CUDA平台历史上…

Pytorch | 从零构建MobileNet对CIFAR10进行分类

Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练过程和测试结果…

Electronjs+Vue如何开发PC桌面客户端(Windows,Mac,Linux)

electronjs官网 https://www.electronjs.org/zh/ Electron开发PC桌面客户端的技术选型非常适合已经有web前端开发人员的团队。能够很丝滑的过渡。 Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.…

【1.排序】

排序 笔记记录 1.排序的基本概念1.1 排序的定义 2. 插入排序2.1 直接插入排序2.2 折半插入排序2.3 希尔排序 3. 交换排序3.1 冒泡排序3.2 快速排序 4. 选择排序4.1 简单选择排序4.2 堆排序 5. 归并排序、基数排序和计数排序5.1 归并排序4.2 基数排序4.3 计数排序 6. 各种内部排…

Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon

文章目录 Linux Swap: 深入解析 mkswap, mkfs.swap, 和 swapon什么是 Swap&#xff1f;主要命令介绍1. mkswap2. mkfs.swap3. swapon 创建和管理 Swap 的步骤1. 创建 Swap 分区2. 初始化 Swap3. 激活 Swap4. 持久化配置5. 查看 Swap 状态 删除 Swap 分区或文件1. 停用 Swap2. 删…

取子串(指针)

#include <stdio.h> #include <string.h>char* substr(char *s, int startloc, int len) {static char result[51]; // 定义一个足够大的静态数组来存储结果static char result1[] {N,U,L,L,\0};int i, j;// 检查startloc是否在字符串的范围内if (startloc < 1…

「Mac畅玩鸿蒙与硬件45」UI互动应用篇22 - 评分统计工具

本篇将带你实现一个评分统计工具&#xff0c;用户可以对多个选项进行评分。应用会实时更新每个选项的评分结果&#xff0c;并统计平均分。这一功能适合用于问卷调查或评分统计的场景。 关键词 UI互动应用评分统计状态管理数据处理多目标评分 一、功能说明 评分统计工具允许用…

递归实现指数型枚举(递归)

92. 递归实现指数型枚举 - AcWing题库 每个数有选和不选两种情况 我们把每个数看成每层&#xff0c;可以画出一个递归搜索树 叶子节点就是我们的答案 很容易写出每dfs函数 dfs传入一个u表示层数 当层数大于我们n时&#xff0c;去判断每个数字的选择情况&#xff0c;输出被选…

Linux相关概念和易错知识点(25)(信号原理、操作系统的原理、volatile)

目录 1.信号的产生 &#xff08;1&#xff09;kill &#xff08;2&#xff09;raise、abort 2.对block、pending、handler表的管理 &#xff08;1&#xff09;信号集&#xff08;sigset_t&#xff09; &#xff08;2&#xff09;block表的管理 ①操作相关的函数 ②sigpr…

opencv中的色彩空间及其转换

在 OpenCV 中&#xff0c;色彩空间&#xff08;Color Space&#xff09;指的是表示颜色的一种方式&#xff0c;或是用数学模型对颜色的表达。不同的色彩空间采用不同的方式来描述颜色的三要素&#xff08;如亮度、饱和度、色调&#xff09;&#xff0c;因此可以在不同的应用场景…