【数据结构】简单认识:堆

简介: 简单认识:堆。

数据结构:堆


1.堆是什么?

2.堆的特性。

3.堆的操作原理

①堆的插入原理

②堆的删除原理



1.堆是什么?


堆是特殊的队列,不同于普通队列,从堆中取出元素是依照元素的优先级大小,而不是元素进入队列的先后顺序,也可以称堆为“优先队列”。


2.堆的特性。


特性①:用数组表示完全二叉树。


堆最常用完全二叉树来表示,因为高为h的完全二叉树有2h-1到2h-1个节点,且节点分布十分规律,也正因如此,可以用数组来实现堆的存储。


如何用数组表示完全二叉树:


根节点存放在数组起始处,为方便子节点找到父节点,起始处下标为1

找寻父节点:某节点下标为 i ,其父节点下标就为 i / 2。

找寻子节点:某节点下标为 i ,其左、右子节点下标分别为 2i ,2i+1。


特性②:部分有序性

任意节点元素的值与其子节点元素的值相关,相关性的不同就决定了两种不同的基本堆:最大堆 和 最小堆。


最大堆:任意节点的值大于或等于其子节点的值,根节点最大。

最小堆:任意节点的值小于或等于其子节点的值,根节点最小。


最大堆( a ),最小堆( b ) 示例:

微信图片_20221031171841.png


3.堆的操作原理


(以最大堆为例)


①堆的插入原理


向最大堆插入新元素后,需要保证的是:

—堆依旧是一颗完全二叉树;

—堆中各节点与其子节点的关系依旧符合最大堆性质。


首先,在数组末尾插入新元素,若新节点值 <= 父节点值,说明位于正确位置。

微信图片_20221031171848.png

在数组末尾插入新元素时,若新节点值 > 父节点值,需要交换位置,直到比父节点小或没有父节点(抵达根节点),才是抵达正确位置。

微信图片_20221031171853.png


②堆的删除原理


删除元素实际上就是取出根节点的最大值元素,再删除一个节点。删除元素后,需要保证的是:

—堆依旧是一颗完全二叉树;

—堆中各节点与其子节点的关系依旧符合最大堆性质。


首先,将根节点(最大值元素)与最后一个节点交换位置,删除最后一个节点,实现取出最大值元素的操作,再删除节点的操作。


(实际上删除的节点元素在数组中依旧存在,但是代表最大堆所含节点数的MaxHeap会减去1,代表删除了最后一个节点)

微信图片_20221031171903.png

完成删除操作后,需要在根节点的左、右子结点中取较大的一个与根节点做比较,根节点小于子节点则与其交换位置。

交换后,继续让此节点重复进行比较,直到此节点的值大于>=子节点值或节点成为叶子节点(不存在子节点)就停止。

微信图片_20221031171908.png


微信图片_20221031171916.png微信图片_20221031171921.png






目录
相关文章
|
7天前
|
存储 算法
【数据结构】堆
【数据结构】堆
|
1月前
|
算法 安全 大数据
揭秘!Python堆与优先队列:数据结构的秘密武器,让你的代码秒变高效战士!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue提供堆与优先队列功能,助你提升算法效率。堆用于快速找大数据集的第K大元素,如示例所示,时间复杂度O(n log k)。PriorityQueue在多线程中智能调度任务,如模拟下载管理器,按优先级处理任务。掌握这些工具,让代码运行更高效!
49 1
|
6天前
|
存储 算法 Linux
【数据结构】树、二叉树与堆(长期维护)(1)
【数据结构】树、二叉树与堆(长期维护)(1)
|
12天前
|
搜索推荐 算法 Go
深入探索堆:Go语言中的高效数据结构
深入探索堆:Go语言中的高效数据结构
|
6天前
|
算法
【数据结构】树、二叉树与堆(长期维护)(2)
【数据结构】树、二叉树与堆(长期维护)(2)
【数据结构】树、二叉树与堆(长期维护)(2)
|
12天前
【数据结构】二叉树顺序实现(大堆)-->赋源码
【数据结构】二叉树顺序实现(大堆)-->赋源码
26 4
|
1月前
|
存储 算法
【数据结构】堆,堆的实现,堆排序,TOP-K问题
数据结构——堆,堆的实现,堆排序,TOP-K问题
22 1
【数据结构】堆,堆的实现,堆排序,TOP-K问题
|
1天前
|
算法
【初阶数据结构篇】堆的应用(堆排序与Top-K问题)
即求数据结合中前K个最⼤的元素或者最⼩的元素,⼀般情况下数据量都⽐较⼤。
|
1天前
|
存储 算法 测试技术
【初阶数据结构篇】实现顺序结构二叉树(堆的实现方法)
注意传过去的参数是插入的位置,即插入前的size,在调整完后再将size++
|
5天前
|
存储
全局变量和局部变量在堆和栈的区别
全局变量和局部变量在堆和栈的区别
17 0