This commit is contained in:
krahets
2023-08-20 23:27:50 +08:00
parent 68e11cfa34
commit 4d55cafd13
46 changed files with 174 additions and 162 deletions

View File

@@ -4,7 +4,7 @@ comments: true
# 8.2   建堆操作
在某些情况下,我们希望使用一个列表的所有元素来构建一个堆,这个过程被称为建堆
在某些情况下,我们希望使用一个列表的所有元素来构建一个堆,这个过程被称为建堆操作”
## 8.2.1   借助入堆方法实现

View File

@@ -4,10 +4,10 @@ comments: true
# 8.1   堆
「堆 Heap」是一种满足特定条件的完全二叉树可分为两种类型
「堆 heap」是一种满足特定条件的完全二叉树可分为两种类型
- 「大顶堆 Max Heap」任意节点的值 $\geq$ 其子节点的值。
- 「小顶堆 Min Heap」任意节点的值 $\leq$ 其子节点的值。
- 「大顶堆 max heap」任意节点的值 $\geq$ 其子节点的值。
- 「小顶堆 min heap」任意节点的值 $\leq$ 其子节点的值。
![小顶堆与大顶堆](heap.assets/min_heap_and_max_heap.png)
@@ -16,16 +16,17 @@ comments: true
堆作为完全二叉树的一个特例,具有以下特性:
- 最底层节点靠左填充,其他层的节点都被填满。
- 我们将二叉树的根节点称为堆顶,将底层最靠右的节点称为堆底
- 我们将二叉树的根节点称为堆顶,将底层最靠右的节点称为堆底
- 对于大顶堆(小顶堆),堆顶元素(即根节点)的值分别是最大(最小)的。
## 8.1.1   堆常用操作
需要指出的是,许多编程语言提供的是「优先队列 Priority Queue」这是一种抽象数据结构定义为具有优先级排序的队列。
需要指出的是,许多编程语言提供的是「优先队列 priority queue」这是一种抽象数据结构定义为具有优先级排序的队列。
实际上,**堆通常用作实现优先队列,大顶堆相当于元素按从大到小顺序出队的优先队列**。从使用角度来看,我们可以将优先队列」和「堆」看作等价的数据结构。因此,本书对两者不做特别区分,统一使用「堆」来命名。
实际上,**堆通常用作实现优先队列,大顶堆相当于元素按从大到小顺序出队的优先队列**。从使用角度来看,我们可以将优先队列”和“堆”看作等价的数据结构。因此,本书对两者不做特别区分,统一使用“堆“来命名。
堆的常用操作见下表,方法名需要根据编程语言来确定。
<p align="center"> 表:堆的操作效率 </p>
<div class="center-table" markdown>
@@ -678,7 +679,7 @@ comments: true
### 3. &nbsp; 元素入堆
给定元素 `val` ,我们首先将其添加到堆底。添加之后,由于 val 可能大于堆中其他元素,堆的成立条件可能已被破坏。因此,**需要修复从插入节点到根节点的路径上的各个节点**,这个操作被称为「堆化 Heapify」。
给定元素 `val` ,我们首先将其添加到堆底。添加之后,由于 val 可能大于堆中其他元素,堆的成立条件可能已被破坏。因此,**需要修复从插入节点到根节点的路径上的各个节点**,这个操作被称为「堆化 heapify」。
考虑从入堆节点开始,**从底至顶执行堆化**。具体来说,我们比较插入节点与其父节点的值,如果插入节点更大,则将它们交换。然后继续执行此操作,从底至顶修复堆中的各个节点,直至越过根节点或遇到无须交换的节点时结束。

View File

@@ -22,7 +22,7 @@ comments: true
!!! tip
当 $k = n$ 时,我们可以得到从大到小的序列,等价于选择排序算法。
当 $k = n$ 时,我们可以得到从大到小的序列,等价于选择排序算法。
## 8.3.2 &nbsp; 方法二:排序