向上调整算法(详解)c++

news/2025/2/5 6:13:17/

算法流程: 

  1. 与⽗结点的权值作⽐较,如果⽐它⼤,就与⽗亲交换; 
  2. 交换完之后,重复 1 操作,直到⽐⽗亲⼩,或者换到根节点的位置

                               

这里为什么插入85完后合法?

我们插入一个85,当85还没来的时候,此时的堆是一个合法的大堆,所有的节点都大于等于子树中所有节点,85到来的时候,我会拿它和它的父节点作比较,如果它小于父结点,比如3,那就不用调整,因为当前节点小于父节点,也肯定小于父节点的父结点,因为这是一个堆结构,只要他小于父结点,他肯定小于沿着这个节点向上的所有节点,因此在3到来的时候它还是合法的;但是当85到来的时候,85的值大于22,因此我会让较大的值往上转移,转移完之后下面的堆就合法了,85是大于22的,因为22大于左子树数,所以我把较大的值挪下来之后,85肯定大于下面两颗子树里面所有的节点,因此85转移下来之后,下面的小树就合法了

                                          

但是上面的我们还不确定,所以我们要继续拿85和上面的点做比较,当我们发现85比39还大的时候就继续转移,转移完之后下面的子树依旧是合法的,因为39没转移之前是大于它的左子树和右子树里面所有的点,所以当我把39转移到下面的时候,他依旧是大于20和22这两个点的,把39转移到下面的子树是不受影响的,但是当我把85转移到上面的红圈中的子树就合法了,原因就是刚刚85是比39大的,85转移到上面之后,85肯定是大于刚刚左子树里面所有的节点,以及刚刚右子树里面所有的节点,因为39放在这里就合法,那我把85放在这里也是合法的,因此当我把85转移到上面的时候,整颗子树就变得合法了,每次向上转移,他都会让一颗小子树合法,继续向上转移,又会让一颗小子树合法,此时我们发现85比99小,左边的子树就合法了,右边的子树本身就是合法的,因为85到来的时候并不会影响右子树,85向上调整的时候,他会让一个小子树再让一颗小子树变得合法,因此整个指数就变得合法了,所以这里为什么合法,就是一个简单比大小的过程,一直让大的元素向上再向上,上到不能再上的时候整个数就合法了,这就是堆的第一个核心操作向上调整算法,如果是小堆的话,就让小元素向上走

                                                   

向上调整算法时间复杂度

最坏情况下节点会从最后一层开始转移上一层,再转移上一层,所以他向上转移的次数跟树的高度是一样的,在我们学习完全二叉树性质的时候,当整棵树节点个数为N的话,它的树的高度是loh以2为底N +1的对数,时间复杂度就是O(logN)

代码实现:

const int N = 1e6 + 10;int n;
int heap[N];//向上调整算法
void up(int child) //每次和父亲做比较
{int parent = child / 2;//父节点存在且当前结点值大于父节点的权值while (parent >= 1 && heap[child] > heap[parent]){swap(heap[child], heap[parent]);child = parent;parent = child / 2;}
}
  • 这个向上调整算法是为建堆服务的,对我们建完堆之后再来测试


http://www.ppmy.cn/news/1569430.html

相关文章

IFeatureWorkspace.CreateFeatureClass(),报错对COM组件的调用返回了错误 HRESULT E_FAIL

1、问题描述:在AE开发中,新增一个空的shpfile文件的时候,报错,如下图: 2、原因分析:产生此问题的原因是未设置默认字段的默认参数,特别是未设置IGeometryDef 参数。 3、解决方案:在…

视频拼接,拼接时长版本

目录 视频较长,分辨率较大,这个效果很好,不耗用内存 ffmpeg imageio,适合视频较短 视频较长,分辨率较大,这个效果很好,不耗用内存 ffmpeg import subprocess import glob import os from nats…

RabbitMQ深度探索:死信队列

死信队列产生背景: RabbitMQ 死信队列俗称 备胎队列:消息中间件因为某种原因拒收该消息后,可以转移到私信队列中存放,死信队列也可以有交换机和路由 key 等 生产死信队列的原因: 消息投递到 MQ 存放,消息已…

一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署

前言 自从deepseek R1发布之后「详见《一文速览DeepSeek R1:如何通过纯RL训练大模型的推理能力以比肩甚至超越OpenAI o1(含Kimi K1.5的解读)》」,deepseek便爆火 爆火以后便应了“人红是非多”那句话,不但遭受各种大规模攻击,即便…

Python爬虫:1药城店铺爬虫(完整代码)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

2.4学习总结

洛谷1305代码 #include<stdio.h> #include<stdlib.h> struct treenode {char val;struct treenode* left;struct treenode* right; }; struct treenode* createnode(char val) {struct treenode* node (struct treenode*)malloc(sizeof(struct treenode));node-&…

Python 科学计算

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

GESP2023年12月认证C++六级( 第三部分编程题(1)闯关游戏)

参考程序代码&#xff1a; #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <string> #include <map> #include <iostream> #include <cmath> using namespace std;const int N 10…