数据结构 ——— 向上调整建堆和向下调整建堆的区别

目录

前言

向下调整算法(默认小堆)

利用向下调整算法对数组建堆

向上调整建堆和向下调整建堆的区别​编辑

向下调整建堆的时间复杂度:

向上调整建堆的时间复杂度:

结论 


前言

在上一章讲解到了利用向上调整算法对数组进行建堆
再利用首尾交换和向下调整建堆算法对数组调整成升序或者降序

数据结构 ——— 向上/向下调整算法将数组调整为升/降序-CSDN博客

接下来要学习的是:利用向下调整算法建堆,然后再比较区别


向下调整算法(默认小堆)

static void AdjustDown(HPDataType* a, int size, int parent)
{
	int child = parent * 2 + 1;
 
	while (child < size)
	{
		// 先找到左右孩子中小的那个
		if ((child + 1 < size) && (a[child + 1] < a[child]))
			child++;
 
		if (a[parent] > a[child])
		{
			// 交换
			Swap(&a[parent], &a[child]);
			
			// 迭代
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

推理过程已经在上一章讲解了,这里就不过多赘述


利用向下调整算法对数组建堆

有以下整型数组a:

int a[] = { 5,7,3,9,1,8,4,6,2 };

如何利用向下调整算法对数组建堆呢?

使用向下调整算法的前提是:需要向下调整的数据的左右子树都是堆,才能使用向下调整算法,否则就算使用向下调整算法,也不能建堆
现在的主要问题就是数组 a 不是堆,且数组首元素的左右子树也不是堆

解决办法:

从数组最后一个元素开始往前向下调整建堆
因为向下建堆的前提是要左右子树是一个堆,那么就先把左右子树建堆,左右子树中又会有左右子树,直到根节点,就停止建堆
所以只需要从数组最后一个元素开始往前依次利用向下建堆算法进行建堆,那么就能把数组 a 建立成大堆/小堆
但是必须要从数组的最后一个元素开始建堆吗?
其实不用,因为最后一个元素是叶子节点,叶子节点的特点就是没有孩子节点,那么叶子节点本身就是一个堆

           5

        /      \
     7          3
    /  \        /  \
  9   1      8  4

 / \
6 2

6、2、8、4 都属于叶子节点,那么就不用对这些节点进行向下调整算法
那么只需要从最后一个叶子节点的父亲节点开始往前进行向下调整算法 
假设最后一个叶子节点 2 的下标为 child
那么父亲节点就可以通过 (child-1)/2 这个公式进行计算,2 的父亲节点也就是 9
对 9 进行了向下调整算法后,就需要对 3 这个子树进行向下调整算法
而且找 3 这个节点只需要 9 节点的下标减一即可
依次往前向下调整,最后调整到数组的首元素,那么就完成了对数组 a 进行建堆

代码验证:

           1

        /      \
     2          3
    /  \        /  \
  5   7      8  4

 / \
6 9


向上调整建堆和向下调整建堆的区别

向下调整建堆的时间复杂度:

最后一层是叶子节点,所以不需要使用向下调整算法
从倒数第二层开始,使用向下调整算法进行建堆
倒数第二层有 2^(h-2) 个节点,每个节点最多向下调整 1 次
那么倒数第二层一共向下调整 2^(h-2)*1 次
倒数第三层有 2^(h-3) 个节点,每个节点最多向下调整 2 次
那么倒数第三层一共向下调整 2^(h-2)*2 次
………………
第二层有 2^1 个节点,每个节点最多向下调整 h-2 次
那么第二层一共向下调整 2^1*(h-2) 次
第二层有 2^0 个节点,每个节点最多向下调整 h-1 次
那么第一层一共向下调整 2^0*(h-1) 次

得出时间复杂度表达式:
F(h) = 2^(h-2)*1 + 2^(h-3)*2 + …… + 2^1*(h-2) + 2^0*(h-1)

通过错位相减法简化以上公式得出:
F(h) = 2^h - 1 - h

且假设节点的总个数为 N ,那么高度h和节点N的关系是: 2^h - 1 == N

最后得出向下调整建堆整体复杂度为:
F(N) = N - log(N+1)
大O渐进表示法:O(N) ,(log(N+1)可以忽略不计)

向上调整建堆的时间复杂度:

除了根节点,其他节点都需要使用向上调整算法
第二层有 2^1 个节点,每个节点最多向上调整 1 次
那么第二层一共向上调整 2^1*1 次
………………
最后一层有 2^(h-1) 个节点,每个节点最多向上调整 (h-1) 次
那么最后一层一共向上调整 2^(h-1)*(h-1) 次

得出时间复杂度表达式:
F(h) = 2^1*1 + 2^2*2 + …… + 2^(h-2)*(h-2) + 2^(h-1)*(h-1)

通过错位相减法简化以上公式得出:
F(h) = 2^h*(h-2)+2

且假设节点的总个数为 N ,那么高度h和节点N的关系是: 2^h - 1 == N

最后得出向下调整建堆整体复杂度为:
F(N) = (N+1) * (log(N+1)-2) + 2
大O渐进表示法:O(N*longN)

结论

向下调整算法的时间复杂度低于向上调整算法的时间复杂度
那么也就是向下调整算法的效率高于向上调整算法的效率

所以要对数组进行建堆的话,推荐使用向下调整建堆算法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图数据库 2 | 大数据的演进和数据库的进阶——从数据到大数据、快数据,再到深数据

时至今日&#xff0c;大数据已无处不在&#xff0c;所有行业都在经受大数据的洗礼。但同时我们也发现&#xff0c;不同于传统关系型数据库的表模型&#xff0c;现实世界是非常丰富、高维且相互关联的。此外&#xff0c;我们一旦理解了大数据的演进历程以及对数据库进阶的强需求…

java版询价采购系统 招投标询价竞标投标系统 招投标公告系统源码

在数字化时代&#xff0c;企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台&#xff0c;涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…

golang通用后台管理系统02(RSA加密解密,登录密码加密解密)

参考&#xff1a;https://blog.csdn.net/lady_killer9/article/details/118026802 1.加密解密工具类PasswordUtil.go package utilimport ("crypto/rand""crypto/rsa""crypto/x509""encoding/pem""fmt""log"&qu…

性能小钢炮,核显玩3A,最值得买的 8745HS 迷你主机『零刻SER8』,2099的价格是真的香

性能小钢炮&#xff0c;核显玩3A&#xff0c;最值得买的 8745HS 迷你主机『零刻SER8』&#xff0c;2099的价格是真的香 哈喽小伙伴们好&#xff0c;我是Stark-C~ 前一个多月的时候我评测了零刻最新最强大的迷你主机『零刻 SER9』的时候&#xff0c;评论区很多小伙伴都说贵。 …

采购退料单集成方案:从旺店通到金蝶云的API实现

14-采购退料单集成方案&#xff1a;旺店通旗舰奇门数据集成到金蝶云星空 在企业的供应链管理中&#xff0c;采购退料单的高效处理至关重要。为了实现这一目标&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将旺店通旗舰奇门的数据无缝对接到金蝶云星空。本次分享的案例…

Java设计模式(代理模式整理中ing)

一、代理模式 1、代理模式定义&#xff1a; 代理模式&#xff1a;由于某些原因要给某对象提供一个代理以控制对该对象的访问&#xff0c;这时访问对象不适合或者不能够直接引用目标对象&#xff0c;代理对象作为访问对象与目标对象之间的中介进行连接调控调用。 2、代理模式的…

大模型的常用指令格式 --> ShareGPT 和 Alpaca (以 llama-factory 里的设置为例)

ShareGPT 格式 提出背景&#xff1a;ShareGPT 格式起初来自于用户在社交平台上分享与聊天模型的对话记录&#xff0c;这些记录涵盖了丰富的多轮对话内容。研究者们意识到&#xff0c;这类真实的对话数据可以帮助模型更好地学习多轮对话的上下文保持、回应生成等能力。因此&…

AI问答:Google Authenticator(谷歌动态口令) / 设置及操作过程记录

Google Authenticator&#xff0c;即谷歌身份验证器&#xff0c;是谷歌推出的一款基于时间的一次性密码&#xff08;Time-based One-time Password&#xff0c;简称TOTP&#xff09;验证工具。以下是关于Google Authenticator验证的详细解释。 一、工作原理 Google Authentic…

PD虚拟机问题:“无法连接到 Parallels 服务” 解决方法

在使用Parallels Desktop 虚拟机的时候&#xff0c;启动时出现以下错误消息&#xff1a; a. Parallels Desktop 无法启动 b. 无法连接至 Parallels服务 c. 在该虚拟机中没有安装操作系统 遇到以上3种问题怎么解决呢&#xff1f;可能的原因如下&#xff1a; 过时的 macO…

干掉复杂的工具类,Hutool 工具库确实香!

Hutool 是一个超全的 Java 工具库&#xff0c;深受国内开发者的喜爱。目前确实是成为了国内使用最广的工具库之一了&#xff0c; Gitee 上的 Star 数也到了 23k 。最近新版本有所改动&#xff0c;这里分享一下最新版本的介绍。 一、Hutool简介 Hutool 真心是一个不错的国产 J…

Rust 力扣 - 2461. 长度为 K 子数组中的最大和

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;用一个哈希表记录窗口内的所有元素&#xff08;用来对窗口内元素去重&#xff09;&#xff0c;我们取哈希表中元素数量等于k的窗口总和的最大值 题解代码 use std::collecti…

LeetCode 684.冗余连接:拓扑排序+哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n)))

【LetMeFly】684.冗余连接&#xff1a;拓扑排序哈希表&#xff08;O(n)&#xff09; 或 并查集&#xff08;O(nlog n)-O(nα(n))&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/redundant-connection/ 树可以看成是一个连通且 无环 的 无向 图。 给定往…

数字IC后端实现之Innovus Place跑完density爆涨案例分析

下图所示为咱们社区a7core后端训练营学员的floorplan。 数字IC后端实现 | Innovus各个阶段常用命令汇总 该学员跑placement前density是59.467%&#xff0c;但跑完place后density飙升到87.68%。 仔细查看place过程中的log就可以发现Density一路飙升&#xff01; 数字IC后端物…

项目管理软件:5款甘特图工具测评

在项目管理中&#xff0c;甘特图作为一种直观且高效的任务进度展示工具&#xff0c;被广泛应用于各个行业。以下是几款功能强大、易于使用的甘特图工具&#xff0c;它们能够帮助项目经理更好地规划、跟踪和管理项目进度。 1、进度猫 进度猫是国内项目管理新秀&#xff0c;是…

MYSQL 真实高并发下的死锁

https://pan.baidu.com/s/1nM3VQdbkNZhnK-wWboEYxA?pwdvwu6 下面是风控更新语句 ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2023-08-04 01:00:10 140188779017984 *** (1) TRANSACTION: TRANSACTION 895271870, ACTIVE 0 sec starting …

CTFshow之信息收集第11关到20关。详细讲解

得而不惜就该 --小阁老 新篇章的接续&#xff01; 一、实验准备 1、ctf网站&#xff1a;ctf.show 2、工具&#xff1a;chrome浏览器、hackbar插件 3、burpsuite抓包工具 二、实验技巧 &#xff08;一&#xff09;域名与子域名的dns解析记录 &#xff08;二&#xff09…

【论文复现】语言模型中的多模态链式推理

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐、摄影的一位博主。 &#x1f4d7;本文收录于论文复现系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

Docker:网络 Network

Docker&#xff1a;网络 Network Docker 网络架构CNMLibnetwork驱动网络类型 命令docker network lsdocker network inspectdocker network createdocker network connectdocker network disconnectdocker network prunedocker network rm 网络操作bridgehostcontainernone Doc…

局部敏感哈希(LSH)简介

0. Intro \textbf{0. Intro} 0. Intro 1️⃣ LSH \text{LSH} LSH的优势&#xff1a;在 λ \lambda{} λ较大的度量空间&#xff0c;也可以高效回答 c-ANN \text{c-ANN} c-ANN查询问题 2️⃣一些预备知识 多重集并集 (multi-set union): \text{(multi-set union): } (multi-set…

论文 | Evaluating the Robustness of Discrete Prompts

论文《Evaluating the Robustness of Discrete Prompts》深入探讨了离散提示&#xff08;Discrete Prompts&#xff09;的鲁棒性&#xff0c;即离散提示在自然语言处理任务中面对不同扰动时的表现。研究特别关注离散提示在自然语言推理&#xff08;NLI&#xff09;任务中的表现…