【C++】手写堆

手写堆(小顶堆)

堆使用数组存储,下标从1开始(下标从0开始也可以)。
下标为u的节点:

  • 左子节点下标为:2 * u(下标从0开始,左子节点则为2 * i + 1
  • 右子节点下标为:2 * u + 1(下标从0开始,左子节点则为2 * i + 1
  • 父节点下标为:u / 2(下标从0开始,父节点则为(u - 1) / 2

在这里插入图片描述

up操作

如果当前结点的值小于父节点,就与父节点交换,重复这一步骤,直到当前节点的值大于父节点。

void up(int u)
{
    while(u / 2 && h[u / 2] < h[u])  // 存在父节点并且父节点的值小于当前节点的值
    {
        swap(h[u], h[u / 2]);
        u /= 2;    // 再对父节点进行up
    }
}

down操作

将当前节点与两个子节点(如果有两个子节点)中的较小值交换,再对那个交换后的子节点进行down操作。

void down(int u)
{
    int t = u;  // t记录两个子节点中较小者
    if(u * 2 <= cnt && h[u * 2] < h[t]) t = u * 2; 
    if(u * 2 + 1 <= cnt && h[u * 2 + 1] < h[t]) t = u * 2 + 1;
    if(t != u)
    {
        swap(h[u], h[t]);   // 与两个子节点中的较小者交换 
        down(t);   // 对交换后的子节点继续进行down
    }
}

建立堆

建立堆有两种方式:

  • 一个一个插入,一次插入的时间复杂度为O(logn),所以总的时间复杂度为O(nlogn)

  • 对下标为n / 2 ~ 1的节点依次进行down操作,时间复杂度为O(n)

    for(int i = n / 2; i; --i) down(i);  // 这种建立堆的方式比较快
    

插入一个数

先在数组最后添加一个数,将堆的大小(即数组的大小+1),再对其进行up操作即可。

h[++cnt] = x;    // 在数组最后添加一个数,将堆的大小(即数组的大小+1)
up(cnt);     // 对其进行up操作

删除堆中最小的元素

因为堆中的最小元素就是数组中的第一个元素(堆的性质),所以只要将数组的最后一个元素赋给第一个元素,将堆的大小(即数组的大小-1),再对第一个元素进行down操作即可。

h[1] = h[cnt--];  // 将数组的最后一个元素赋给第一个元素
down(1);  // 对第一个元素进行down操作

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

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

相关文章

No184.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

NGINX三种虚拟主机的配置

基于IP的配置 首先在原本基础上增加两个IP地址 [rootlocalhost conf.d]# nmcli connection modify ens33 ipv4.addresses 192.168.38.140 [rootlocalhost conf.d]# nmcli connection modify ens33 ipv4.addresses 192.168.38.150 [rootlocalhost conf.d]# nmcli connection u…

绝了!现在制作电子期刊这么快而有效了?

​随着科技的进步&#xff0c;制作电子期刊已经变得越来越简单和高效。现在&#xff0c;您只需要一台电脑或手机&#xff0c;就可以快速制作出精美的电子期刊&#xff0c;而且还能有效地吸引读者的注意力。 但是如何快而有效的制作电子期刊呢&#xff1f; 1.首先打开FLBOOK在线…

网络安全之认识托管威胁检测与响应(MDR)

随着数字化转型加速&#xff0c;企业的IT环境日益复杂&#xff0c;面临的网络安全威胁也在不断增加。传统的防御措施已经无法有效应对新型威胁&#xff0c;而且很多企业缺乏专业的网络安全团队和技术手段&#xff0c;导致大量的安全事件未能及时被发现和处理。 在这种背景下&a…

Java --- 直接内存

一、直接内存 1、不是虚拟机运行时数据区的一部分&#xff0c;也不是《Java虚拟机规范》中定义的内存区域。 2、直接内存是在Java堆外的&#xff0c;直接向系统申请的内存区间。 3、来源于NIO&#xff0c;通过存在堆中的DirectByteBuffer操作Native内存。 4、访问直接内存的…

贝锐蒲公英X1解决远程访问NAS难题

由于经常在外出差和旅游&#xff0c;需要实现即使在外地也能远程登录回去家里的NAS去处理事情或传输文件&#xff0c;因此解决方案之一是搭建一个安全简易的个人私有云。 实施难度 &#xff08;1&#xff09;家庭网络无公网IP&#xff0c;且公网IP价格昂贵&#xff08;2&…

伙伴(buddy)系统原理

一、伙伴算法的由来 在实际情况中&#xff0c;操作系统必须能够在任意时刻申请和释放任意大小的内存&#xff0c;该函数的实现需要考虑延时问题和碎片问题。 延时问题指的是系统查找到可分配单元的时间变长&#xff0c;例如程序请求分配一个64KB的内存空间&#xff0c;系统查看…

SpringBoot自动装配定义先后顺序失效原因极其解析

SpringBoot自动装配定义先后顺序失效原因极其解析 1、场景分析1.1、问题总结 2、使用AutoConfigureBefore、AutoConfigureAfter和AutoConfigureOrder注解指定加载顺序2.2、AutoConfigureXX注解失效原因总结 3、使用静态内部装配类提升加载顺序4、bean加载顺序规则 1、场景分析 …

数据挖掘:关联规则,异常检测,挖掘的标准流程,评估指标,误差,聚类,决策树

数据挖掘&#xff1a;关联规则 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要…

使用74HC165扩展uno的输入管脚

74HC165管脚定义&#xff1a; 使用3个管脚扩展接入个独立开关 const int dataPin 2; /* Q7 */ const int clockPin 3; /* CP */ const int latchPin 4; /* PL */ const int numBits 8; /* Set to 8 * number of shift registers */ void setup() { Serial.begin…

爬虫,TLS指纹 剖析和绕过

当你欲爬取某网页的信息数据时&#xff0c;发现通过浏览器可正常访问&#xff0c;而通过代码请求失败&#xff0c;换了随机ua头IP等等都没什么用时&#xff0c;有可能识别了你的TLS指纹做了验证。 解决办法&#xff1a; 1、修改 源代码 2、使用第三方库 curl-cffi from curl…

JS算法练习 11.12

leetcode 2622 有时间限制的缓存 看这道题之前&#xff0c;先复习一下Map类的用法&#xff08;和array.map()区分开&#xff09; //创建一个Map对象 const map new Map();//set()方法添加键值对 map.set(key, value); map.set(key, {value1, value2})//get()获取键对应的值 …

基于Springboot菜谱美食饮食健康管理系统设计与实现

博主介绍&#xff1a;✌Csdn特邀作者、博客专家、博客云专家、B站程序阿龙带小白做毕设系列&#xff0c;项目讲解、B站粉丝排行榜前列、专注于Java技术领域和毕业项目实战✌ 有设计项目或者是研究参考的可以加微信&#xff1a;Script-Liu 或者是QQ:1339941174 使用的软件开发环…

类和对象(3):拷贝构造函数

引入&#xff1a; class Stack { public:Stack(int capacity 3){_a (int*)malloc(sizeof(int) * capacity);if (nullptr _a){perror("malloc");exit(-1);}_top 0;_capacity capacity;}~Stack(){free(_a);_top _capacity 0;_a nullptr;}private:int* _a;int _…

Leetcode—680.验证回文串II【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—680.验证回文串II 实现代码 class Solution { public:bool judgeFunc(string s, int left, int right) {while(left < right) {if(s[left] ! s[right]) {return false;}left;right--;}return true;}bool validPalin…

腾讯云优惠券介绍、作用、领取方法及使用教程

随着云计算技术的发展&#xff0c;越来越多的企业和个人选择使用云服务进行数据存储、计算等业务。腾讯云作为国内知名的云服务商&#xff0c;提供了一整套完善的云解决方案&#xff0c;并不定期发放优惠券以吸引更多的客户。本文将为大家详细介绍腾讯云优惠券的作用、领取方法…

GCC工具详解【Linux知识贩卖机】

很多人在喧嚣声中登场&#xff0c;也有少数人在静默中退出。 --单独中的洞见2 文章目录 简介程序到可执行文件链接动态链接和静态链接动态库和静态库动态库和静态库的打包打包静态库打包动态库选项 -static 总结 简介 GCC&#xff08;GNU Compiler Collection&#xff09; 是一…

Python之函数进阶-函数执行原理

Python之函数进阶-函数执行原理 函数执行流程 C语言中&#xff0c;函数的活动和栈有关。栈是后进先出的数据结构。栈是由底端向顶端生长&#xff0c;栈顶加入数据成为压栈、入栈、栈顶弹出数据称为出栈。 def add(x, y):r x yprint(r)return rdef main():a 1r add(a, 2)r…

Windows下Oracle安装和卸载

Windows下Oracle安装和卸载 1、Windows下安装Oracle 安装的版本&#xff1a;win32_11gR2_database。 解压之后双击setup.exe程序。 点击是。 配置安全更新&#xff0c;去掉复选框&#xff0c;点下一步。 提示未指定电子邮件地址&#xff0c;点是跳过。 配置安装选项&#xf…

【YOLOv5】【模型压缩与加速】【量化】FP32、FP16、INT8

量化是将模型参数的存储类型从高精度存储降到低精度存储&#xff0c;从而达到减小模型体积大小、加快模型推理速度的效果。 目录 FP32量化 FP16量化 INT8量化 FP32量化 这个直接使用yolov5的export导出32位存储的 engine格式模型即可 python export.py --weights runs/train/…