hello-algo/docs/chapter_heap/heap.md
Yudong Jin dcc3b2e35b Optimize arrToTree function
in java, cpp, py, go, js, ts.
2023-01-08 19:03:22 +08:00

2 KiB
Raw Blame History

「堆 Heap」是一种特殊的树状数据结构并且是一颗「完全二叉树」。堆主要分为两种

  • 「大顶堆 Max Heap」任意结点的值 \geq 其子结点的值,因此根结点的值最大;
  • 「小顶堆 Min Heap」任意结点的值 \leq 其子结点的值,因此根结点的值最小;

(图)

!!! tip ""

大顶堆和小顶堆的定义、性质、操作本质上是相同的,区别只是大顶堆在求最大值,小顶堆在求最小值。

堆常用操作

值得说明的是,多数编程语言提供的是「优先队列 Priority Queue」其是一种抽象数据结构定义为具有出队优先级的队列

而恰好,堆的定义与优先队列的操作逻辑完全吻合,大顶堆就是一个元素从大到小出队的优先队列。从使用角度看,我们可以将「优先队列」和「堆」理解为等价的数据结构,下文将统一使用 “堆” 这个名称。

堆的常用操作见下表(方法命名以 Java 为例)。

Table. 堆的常用操作

方法 描述
add() 元素入堆
poll() 堆顶元素出堆
peek() 访问堆顶元素(大 / 小顶堆分别为最大 / 小值)
size() 获取堆的元素数量
isEmpty() 判断堆是否为空

堆的实现

!!! tip

下文使用「大顶堆」来举例,「小顶堆」的用法与实现可以简单地将所有 $>$ ($<$) 替换为 $<$ ($>$) 即可。

我们一般使用「数组」来存储「堆」,这是因为完全二叉树非常适合用数组来表示(在二叉树章节有详细解释)。

堆常见应用

  • 优先队列。
  • 堆排序。
  • 获取数据 Top K 大(小)元素。