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

54 lines
2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 堆
「堆 Heap」是一种特殊的树状数据结构并且是一颗「完全二叉树」。堆主要分为两种
- 「大顶堆 Max Heap」任意结点的值 $\geq$ 其子结点的值,因此根结点的值最大;
- 「小顶堆 Min Heap」任意结点的值 $\leq$ 其子结点的值,因此根结点的值最小;
(图)
!!! tip ""
大顶堆和小顶堆的定义、性质、操作本质上是相同的,区别只是大顶堆在求最大值,小顶堆在求最小值。
## 堆常用操作
值得说明的是,多数编程语言提供的是「优先队列 Priority Queue」其是一种抽象数据结构**定义为具有出队优先级的队列**。
而恰好,堆的定义与优先队列的操作逻辑完全吻合,大顶堆就是一个元素从大到小出队的优先队列。从使用角度看,我们可以将「优先队列」和「堆」理解为等价的数据结构,下文将统一使用 “堆” 这个名称。
堆的常用操作见下表(方法命名以 Java 为例)。
<p align="center"> Table. 堆的常用操作 </p>
<div class="center-table" markdown>
| 方法 | 描述 |
| --------- | -------------------------------------------- |
| add() | 元素入堆 |
| poll() | 堆顶元素出堆 |
| peek() | 访问堆顶元素(大 / 小顶堆分别为最大 / 小值) |
| size() | 获取堆的元素数量 |
| isEmpty() | 判断堆是否为空 |
</div>
```java
```
## 堆的实现
!!! tip
下文使用「大顶堆」来举例,「小顶堆」的用法与实现可以简单地将所有 $>$ ($<$) 替换为 $<$ ($>$) 即可。
我们一般使用「数组」来存储「堆」,这是因为完全二叉树非常适合用数组来表示(在二叉树章节有详细解释)。
## 堆常见应用
- 优先队列。
- 堆排序。
- 获取数据 Top K 大(小)元素。