小顶堆
1.什么是堆
- 堆是一种非线性结构,堆的逻辑结构是基于二叉树来的,实际存储结构一般是基于数组来实现的
- 堆通常是基于完全二叉树来的(满二叉树也算)
2.堆的分类
按照堆的特点可以把堆分为大顶堆和小顶堆
- 大顶堆:每个结点的值都大于或等于其左右孩子结点的值,根节点元素是所有元素最大的
- 小顶堆:每个结点的值都小于或等于其左右孩子结点的值,根节点元素是所有元素最小的
3.公式
- 大顶堆:arr[i]>=arr[2i+1]&&arr[i]>=arr[2i+2]
- 小顶堆:arr[i]<=arr[2i+1]&&arr[i]<=arr[2i+2]
4.完全二叉树与满二叉树
完全二叉树
必须有两个分叉,如果节点有子节点则这个子节点必须在左边,如果没有子节点也可以
满二叉树
所有叶子节点都得是满的,不能只有左子节点或右子节点
注意
与平常的树不一样,小顶堆不要求子节点左小右大,大顶堆也类似
5.堆的存储结构
逻辑存储结构
实际存储结构
6.堆序性
介绍
- 小根堆最小堆排序:根节点所有元素中最小
- 大根堆最大堆排序:根节点所有元素中最大
图示小顶堆
图示大顶堆
如何保证堆序性
在对堆进行删除或添加数据的时候可能会破坏堆序性,比如小顶堆目前最小的是2插入了一个1,需要用一定手段来保证堆序性
上滤
下滤
7.优先队列与堆
堆的这种特性非常的有用,堆常常被当做优先队列使用,因为可以快速的访问到“最重要”的元素
8.小顶堆的问题
上滤和下滤在数据量大的时候性能非常差,因为要频繁的对比,也就是时间复杂度很高