一
因为堆的逻辑结构与完全二叉树的逻辑结构一模一样,所以可以说「堆」是一种满足特定条件的完全二叉树
二
堆主要可分为以下两种类型
‧「大顶堆」:任意节点的值 ≥ 其子节点的值 的完全二叉树。
‧「小顶堆」:任意节点的值 ≤ 其子节点的值 的完全二叉树。
我们将二叉树的根节点称为“堆顶”,将底层最靠右的节点称为“堆底”
对于大顶堆(小顶堆),堆顶元素的值分别是最大(最小)的
三
方法名 | 描述 | 时间复杂度 |
---|---|---|
push(x) | 元素入堆 | 𝑂(log 𝑛) |
pop() | 堆顶元素出堆 | 𝑂(log 𝑛) |
top() | 访问堆顶元素 | 𝑂(1) |
size() | 获取堆的元素数量 | 𝑂(1) |
empty() | 判断堆是否为空 | 𝑂(1) |
四
因为 完全二叉树非常适合用数组来表示 并且 堆正是一种完全二叉树 ,所以可以使用数组来实现堆
五
堆常见应用
‧ 优先队列:堆通常作为实现优先队列的首选数据结构,其入队和出队操作的时间复杂度均为 𝑂(log 𝑛) ,而建队操作为 𝑂(𝑛) ,这些操作都非常高效。
‧ 堆排序:给定一组数据,我们可以用它们建立一个堆,然后不断地执行元素出堆操作,从而得到有序数据。然而,我们通常会使用一种更优雅的方式实现堆排序,详见后续的堆排序章节。
‧ 获取最大的 𝑘 个元素:这是一个经典的算法问题,同时也是一种典型应用,例如选择热度前 10 的新闻 作为微博热搜,选取销量前 10 的商品等。