当前位置: 首页 > news >正文

算法笔记-第九章-堆(未完成-=需要好好搞搞题目)

算法笔记-第九章-堆

  • 堆的基础知识
    • 堆的相关性质
    • 堆序性
    • 堆的存储
    • 堆的基础操作
      • 下滤操作
      • 上滤操作
    • 建堆
      • 自顶向下建堆法
      • 自下而上建堆法
    • 堆的应用
      • 优先队列
  • 大佬讲解
  • 向下调整够建大顶堆

堆的基础知识

堆的相关性质

大佬视频总结

  • 堆必须是一个完全二叉树
  • 完全二叉树只允许最后一行不为满,且最后一行必须是从左到右排序,之间不可以右间隔
  • 堆的存储=节点下标为i,左子节点下标为2i+1,右子节点下标为2i+2

堆序性

在这里插入图片描述
小根堆
在这里插入图片描述
在这里插入图片描述

堆的存储

  • 类似于层次遍历的形式进行排序
  • 将下标对应到数组当中,这样一个堆就可以用一个数组来代表
  • 在这里插入图片描述

在这里插入图片描述

堆的基础操作

下滤操作

如何将树调整成堆呢?
将破坏堆序性的元素和他的最大的子结点比较,如果小于则进行交换

在这里插入图片描述

在这里插入图片描述

上滤操作

现在就是只有树的最后一个元素破坏了堆序性
方法:将他和他的父元素比较,若大于父节点则进行交换,直到无法上移为止
在这里插入图片描述
在这里插入图片描述

建堆

问题:如果有一个乱序的数组如何进行建堆呢?
有两种方法:自下而上和自上而下

自顶向下建堆法

方法:

  • 插入堆
  • 上滤

将新元素放到堆的最后一位,然后进行上滤操作

自下而上建堆法

  • 先把下面的元素调整成堆
  • 然后再对父节点进行下滤操作
    方法是:每次对于倒数第二排父节点进行下滤操作,直到根节点操作完毕

堆的应用

优先队列

两种操作 :一个是插入队列,一个是弹出最小元素
在这里插入图片描述

一般使用小根堆来实现,弹出之后需要调整操作‘
方法:
将最后一个元素放到根节点,然后进行下滤操作

插入操作:上滤操作就是插入操作

在这里插入图片描述

大佬讲解

向下调整够建大顶堆

在这里插入图片描述
在这里插入图片描述

#include <cstdio>
#include <algorithm>
using namespace std;const int MAXN = 1000 + 1;
int heap[MAXN];void downAdjust(int low, int high) {int i = low, j = i * 2;while (j <= high) {if (j + 1 <= high && heap[j + 1] > heap[j]) {j = j + 1;}if (heap[j] > heap[i]) {swap(heap[j], heap[i]);i = j;j = i * 2;}else {break;}}
}void createHeap(int n) {for (int i = n / 2; i >= 1; i--) {downAdjust(i, n);}
}
int main() {int n;scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &heap[i]);}createHeap(n);for (int i = 1; i <= n; i++) {printf("%d", heap[i]);if (i < n) {printf(" ");}}return 0;
}

相关文章:

  • 云原生周刊:Istio 1.20.0 发布 | 2023.11.20
  • 软件测试/测试开发/人工智能丨基于Spark的分布式造数工具:加速大规模测试数据构建
  • Uniapp连接iBeacon设备——实现无线定位与互动体验(实现篇)
  • Django学习日志08
  • 【CHI】Ordering保序
  • Ubuntu20.0中安装Gradle
  • Matplotlib实现Label及Title都在下方的最佳姿势
  • NX二次开发UF_CAM_ask_post_template_name 函数介绍
  • 命令执行无回显的判断方法及dnslog相关例题的讲解
  • 【金融分析】Python:病人预约安排政策 | 金融模拟分析
  • 3.8-镜像的发布
  • Java 12 及Tomcat 部署配置
  • BUUCTF [BJDCTF2020]一叶障目 1
  • vscode设置前进、后退快捷键
  • CISP模拟试题(一)
  • CODING 缺陷管理功能正式开始公测
  • express + mock 让前后台并行开发
  • java概述
  • Material Design
  • node.js
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Shell编程
  • spring学习第二天
  • tweak 支持第三方库
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 使用SAX解析XML
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • # 数论-逆元
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (转)Linux下编译安装log4cxx
  • (转)大型网站架构演变和知识体系
  • ***详解账号泄露:全球约1亿用户已泄露
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .gitignore文件设置了忽略但不生效
  • .NET CLR基本术语
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net实现客户区延伸至至非客户区
  • @RequestMapping-占位符映射
  • [ Linux ] Linux信号概述 信号的产生
  • [<死锁专题>]
  • [ARM]ldr 和 adr 伪指令的区别
  • [C#]C#学习笔记-CIL和动态程序集
  • [CCIE历程]CCIE # 20604
  • [HCTF 2018]WarmUp (代码审计)
  • [Hive] CTE 通用表达式 WITH关键字
  • [javaSE] GUI(Action事件)
  • [leetcode top100] 0924 找到数组中消失的数,合并二叉树,比特位计数,汉明距离
  • [Linux版本Debian系统]安装cuda 和对应的cudnn以cuda 12.0为例
  • [LWC] Components Communication
  • [nlp] id2str的vocab.json转换为str2id
  • [Node + Docker] 聊聊怎么把 nodeclub 构建成 Docker 镜像