【C++】手写堆

news2024/11/28 21:55:09

手写堆(小顶堆)

堆使用数组存储,下标从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操作

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

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

相关文章

最大似然估计直观理解

目的 由于直接估计类条件概率密度函数很困难。 解决的办法&#xff0c;把估计完全未知的概率密度转化为估计参数。这里就将概率密度估计问题转化为参数估计问题&#xff0c; 极大似然估计就是一种参数估计方法。当然了&#xff0c;概率密度函数的选取很重要&#xff0c;模型正…

在代码中忽略特定的编译告警

在移植别人的代码时&#xff0c;有些告警看着不爽&#xff0c;但又不想去改动原来的代码。可以在头文件中加一句&#xff1a; #pragma diag_suppress 111 即可忽略特定的编译告警。 其中&#xff0c;111是告警代码。 #pragma diag_suppress 111 比如&#xff0c;原始代码的…

【网络】UDP协议

UDP协议 一、传输层1、再谈端口号2、两个命令 二、UDP协议1、UDP协议格式2、UDP的解包和分用3、UDP的特点4、UDP使用注意事项5、基于UDP的应用层协议 一、传输层 我们以前在学习HTTP等应用层协议时&#xff0c;为了便于理解&#xff0c;简单的认为HTTP协议是将请求和响应直接发…

AI:75-基于生成对抗网络的虚拟现实场景增强

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

如何将系统盘MBR转GPT?无损教程分享!

什么是MBR和GPT&#xff1f; MBR和GPT是磁盘的两种分区形式&#xff1a;MBR&#xff08;主引导记录&#xff09;和GPT&#xff08;GUID分区表&#xff09;。 新硬盘不能直接用来保存数据。使用前应将其初始化为MBR或GPT分区形式。但是&#xff0c;如果您在MBR时需…

微服务-网关设计

文章目录 引言I 网关部署java启动jar包II 其他服务部署细节2.1 服务端api 版本号III 网关常规设置3.1 外部请求系统服务都需要通过网关访问3.2 第三方平台回调校验文件的配置IV 微服务日志跟踪4.1 打印线程ID4.2 封装线程池任务执行器4.3 将自身MDC中的数据复制给子线程4.4 微服…

「我在淘天做技术」音视频技术及其在淘宝内容业务中的应用

作者&#xff1a;李凯 一、前言 近年来&#xff0c;内容电商似乎已经充分融入到人们的生活中&#xff1a;在闲暇时间&#xff0c;我们已经习惯于拿出手机&#xff0c;从电商平台的直播间、或者短视频链接下单自己心仪的商品。 尽管优质的货品、实惠的价格、精致的布景、有趣的…

03-React事件处理 生命周期 Diffing算法

React事件处理 背景 1.通过onXxx属性指定事件处理函数(注意大小写) React使用的是自定义(合成)事件, 而不是使用的原生DOM事件 比如原生onclick的事件在React中变成了onClick&#xff0c;这么搞是为了更好的兼容性React中的事件是通过事件委托方式处理的(委托给组件最外层的…

MUYUCMS v2.1:一款开源、轻量级的内容管理系统基于Thinkphp开发

MuYuCMS&#xff1a;一款基于Thinkphp开发的轻量级开源内容管理系统&#xff0c;为企业、个人站长提供快速建站解决方案。它具有以下的环境要求&#xff1a; 支持系统&#xff1a;Windows/Linux/Mac WEB服务器&#xff1a;Apache/Nginx/ISS PHP版本&#xff1a;php > 5.6 (…

超级简单的springboot整合springsecurity oauth2第三方登录

前言 springboot整合springsecurity oauth2进行第三方登录&#xff0c;例如qq、微信、微博。网上一堆教程&#xff0c;并且很多都是旧版本的&#xff0c;篇幅又长&#xff0c;哔哩吧啦一大堆&#xff0c;就算你搞下来了&#xff0c;等下次版本升级或变更一下&#xff0c;你又不…

5分频【FPGA】

所以数据对齐晶振。 从第一个晶振开始&#xff1a; 5分频&#xff1a; 2.5晶振高电平&#xff0c;2.5晶振低电平 clk1是 32 clk2是23 需要 clk2下降沿【拉低】clk1上升沿【拉高】 clk_out clk1 & clk2; 推荐5分频&#xff1a;

一文带你速通Seata的XA模式

目录 XA规范协议 基本介绍 分布式事务处理模型角色 两阶段提交 Seata的XA的模式 基本介绍 具体使用 小结 XA规范协议 基本介绍 在讲解Seate中的XA模式之前我们先来了解了解什么是XA规范。XA 规范 是 X/Open 组织定义的分布式事务处理&#xff08;DTP&#xff0c;Distr…

计算机毕业设计项目选题推荐(免费领源码)java+Springboot+Mysql邻家优选超市线上线下购物系统小程序92713

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

运维那些事儿|2023年,运维还有出路吗?

作为一名运维&#xff0c;不知道你有没有这样的感受。 觉得自己的工作没什么成长空间。每天装个系统、跑个机房、跑个脚本&#xff0c;忙来忙去也没忙出来什么名堂&#xff0c;含金量低不说&#xff0c;薪资也一直没见涨&#xff0c;所以你开始陷入迷茫&#xff0c;会疑惑&…

第二证券:机构策略:大盘有望继续走出震荡攀升走势

3053点上方途径压力较为明显&#xff0c;短期内打破3053点上方途径需求量能的不断释放&#xff0c;周三两市成交量再度打破万亿&#xff0c;这为后市向上打破奠定了基础&#xff0c;短线大盘打破前期3053点上方途径难以一蹴即至&#xff0c;但先行目标科创100、国证2000现已光复…

【Linux C IO多路复用】多用户聊天系统

目录 Server-Client mutiplexingServer mutiplexingClient mutiplexing Server-Client 在Linux系统中&#xff0c;IO多路复用是一种机制&#xff0c;它允许一个进程能够监视多个文件描述符&#xff08;sockets、pipes等&#xff09;的可读、可写和异常等事件。这样&#xf…

基于RTLS的资产追踪

第1章 什么是资产追踪&#xff1f; 资产跟踪使最终用户能够监控和管理物理对象&#xff0c;无论是在配送中心、制造工厂、仓库还是医疗保健环境中&#xff0c;仅举几个可能的场景。 资产跟踪通常由硬件和软件组成&#xff0c;旨在报告物理对象的状态&#xff0c;特别强调位置…

目标检测标注的时代已经过去了?

在快速发展的机器学习领域&#xff0c;有一个方面一直保持不变&#xff1a;繁琐和耗时的数据标注任务。无论是用于图像分类、目标检测还是语义分割&#xff0c;长期以来人工标记的数据集一直是监督学习的基础。 然而&#xff0c;由于一个创新性的工具 AutoDistill&#xff0c;这…

Kakao账号注册全流程,如何Kakao多开?

Kakao是目前韩国地区最流行的通讯生活服务软件&#xff0c;相当于我们国内的微信&#xff0c;如果您的业务正准备或者正在进军这个区域&#xff0c;那么少不了需要注册并使用这个平台&#xff0c;甚至需要Kakao多开&#xff08;多账号同时管理与使用&#xff09;&#xff0c;本…