数据结构---堆
创始人
2024-05-17 05:39:38
0

·定义
·基本操作
·建堆
·堆排序
·优先队列

一、堆的定义
·堆必须是一个完全二叉树
·还得满足堆序性

什么是完全二叉树呢?
·完全二叉树只允许最后一行不为满
·且最后一行必须从左到右排序
·最后一行元素之间不可有间隔,中间不可有空缺

如下几棵树是完全二叉树:
在这里插入图片描述
不是完全二叉树:

在这里插入图片描述

二、堆序性:
根据堆序性,可以把对分为两类:
·大根堆:每个父节点都大于它的子节点
·小根堆:每个父节点都小于它的子节点
节点下标为i,左节点为2i+1,右节点为2i+2

在这里插入图片描述
三、堆的基本操作
·上滤
·下滤
下滤:我们把根节点向下调整的方法叫做下滤。复杂度:O(logN)

以大根堆为例,我们将破坏堆序性的元素跟其他的最大子节点比较,如果小于它的最大子节点就与之交换,持续比较,交换,直到该元素大于它的子节点为止,或者移动到底部为止。

在这里插入图片描述
经过下滤:
在这里插入图片描述
·上滤:我们把子节点向上调整的方法叫做上滤
这一次的情况是只有树的最后一个元素破坏了堆序性,同理让它和它的父元素进行过比较。复杂度为:O(logN)

在这里插入图片描述
经过上滤:
在这里插入图片描述


四、如果有一个乱序的数组,要怎么操作才能把它转化成堆呢?
建堆方法:

·自顶向下:对应的操作为上滤,步骤为:1.插入堆,2.上滤
–将新元素放在堆的最后一位,然后对其进行上滤操作。
复杂度为O(N logN)

·自下向上:从倒数第二层开始,对每个父节点进行下滤。复杂度为O(N)
思路:先把下面的元素调整成堆(根先不管),然后再对父节点进行下滤操作,具体操作是从倒数第二排开始。


五、应用:
1.优先队列:可以用小根堆实现,因为小根堆根元素就是最小元素
·插入队列:上滤操作本来就是插入堆的操作,复杂度O(logN)
·弹出最小元素,弹出后要把剩下的元素调整成堆,复杂度O(logN),方法:

1、把最后一个元素放到根节点
2、进行下滤操作

2.堆排序(复杂度O(N logN)):
·存放的结果,会存放在堆的空节点里。
·我们使用大根堆进行从小到大的排序,使用小根堆进行从大到小的排序。

以大根堆从小到大排序为例:
步骤一:把根节点与最后一个没排序的节点进行交换
步骤二:寻找最大的根节点
重复步骤一二

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

上一篇:InstanceNorm LayerNorm

下一篇:Java链表OJ题

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...