02.小顶堆

231 阅读2分钟

小顶堆

1.什么是堆

  • 堆是一种非线性结构,堆的逻辑结构是基于二叉树来的,实际存储结构一般是基于数组来实现的
  • 堆通常是基于完全二叉树来的(满二叉树也算)

2.堆的分类

按照堆的特点可以把堆分为大顶堆和小顶堆

  • 大顶堆:每个结点的值都大于或等于其左右孩子结点的值,根节点元素是所有元素最大的
  • 小顶堆:每个结点的值都小于或等于其左右孩子结点的值,根节点元素是所有元素最小的

3.公式

  • 大顶堆:arr[i]>=arr[2i+1]&&arr[i]>=arr[2i+2]
  • 小顶堆:arr[i]<=arr[2i+1]&&arr[i]<=arr[2i+2]

4.完全二叉树与满二叉树

完全二叉树

必须有两个分叉,如果节点有子节点则这个子节点必须在左边,如果没有子节点也可以

e8e1ed3559d7d011aace985fa24d0d24.png

满二叉树

所有叶子节点都得是满的,不能只有左子节点或右子节点

644092d318ab248454dfcbf3029f8482.png

注意

与平常的树不一样,小顶堆不要求子节点左小右大,大顶堆也类似

5.堆的存储结构

逻辑存储结构

7f2c68fcbbfbe7b07452a107557be56a.png

实际存储结构

ee5c94d062186a1f49c2a326c7e860ef.png

6.堆序性

介绍

  • 小根堆最小堆排序:根节点所有元素中最小
  • 大根堆最大堆排序:根节点所有元素中最大

图示小顶堆

340b9aa47b3f07ee165b90993597e520.png

图示大顶堆

0a2fc754ba99e7818d3f806a613bdf6c.png

如何保证堆序性

在对堆进行删除或添加数据的时候可能会破坏堆序性,比如小顶堆目前最小的是2插入了一个1,需要用一定手段来保证堆序性

上滤

891971bf6854b28f43a4e4aa6fab6571.png 1619eb41dabc21721522566989d2a72a.png

下滤

1b0599cff1b31a45ea2e4ccd7788ff7b.png 17a988d68c53813ceb7a96ce5f5e25e2.png

7.优先队列与堆

堆的这种特性非常的有用,堆常常被当做优先队列使用,因为可以快速的访问到“最重要”的元素

8.小顶堆的问题

上滤和下滤在数据量大的时候性能非常差,因为要频繁的对比,也就是时间复杂度很高