This commit is contained in:
krahets
2023-05-21 19:29:43 +08:00
parent 0c64fc7315
commit 5a68f683b9
26 changed files with 93 additions and 93 deletions
+4 -4
View File
@@ -2,17 +2,17 @@
comments: true
---
# 9.2.   建堆操作 *
# 8.2.   建堆操作 *
如果我们想要根据输入列表生成一个堆,这个过程被称为「建堆」。
## 9.2.1.   借助入堆方法实现
## 8.2.1.   借助入堆方法实现
最直接的方法是借助“元素入堆操作”实现,首先创建一个空堆,然后将列表元素依次添加到堆中。
设元素数量为 $n$ ,则最后一个元素入堆的时间复杂度为 $O(\log n)$ 。在依次添加元素时,堆的平均长度为 $\frac{n}{2}$ ,因此该方法的总体时间复杂度为 $O(n \log n)$ 。
## 9.2.2.   基于堆化操作实现
## 8.2.2.   基于堆化操作实现
有趣的是,存在一种更高效的建堆方法,其时间复杂度仅为 $O(n)$ 。我们先将列表所有元素原封不动添加到堆中,**然后迭代地对各个节点执行“从顶至底堆化”**。当然,**我们不需要对叶节点执行堆化操作**,因为它们没有子节点。
@@ -162,7 +162,7 @@ comments: true
}
```
## 9.2.3.   复杂度分析
## 8.2.3.   复杂度分析
为什么第二种建堆方法的时间复杂度是 $O(n)$ ?我们来展开推算一下。
+4 -4
View File
@@ -2,7 +2,7 @@
comments: true
---
# 9.1.   堆
# 8.1.   堆
「堆 Heap」是一种满足特定条件的完全二叉树,可分为两种类型:
@@ -19,7 +19,7 @@ comments: true
- 我们将二叉树的根节点称为「堆顶」,将底层最靠右的节点称为「堆底」。
- 对于大顶堆(小顶堆),堆顶元素(即根节点)的值分别是最大(最小)的。
## 9.1.1.   堆常用操作
## 8.1.1.   堆常用操作
需要指出的是,许多编程语言提供的是「优先队列 Priority Queue」,这是一种抽象数据结构,定义为具有优先级排序的队列。
@@ -307,7 +307,7 @@ comments: true
```
## 9.1.2.   堆的实现
## 8.1.2.   堆的实现
下文实现的是大顶堆。若要将其转换为小顶堆,只需将所有大小逻辑判断取逆(例如,将 $\geq$ 替换为 $\leq$ )。感兴趣的读者可以自行实现。
@@ -1345,7 +1345,7 @@ comments: true
}
```
## 9.1.3.   堆常见应用
## 8.1.3.   堆常见应用
- **优先队列**:堆通常作为实现优先队列的首选数据结构,其入队和出队操作的时间复杂度均为 $O(\log n)$ ,而建队操作为 $O(n)$ ,这些操作都非常高效。
- **堆排序**:给定一组数据,我们可以用它们建立一个堆,然后依次将所有元素弹出,从而得到一个有序序列。当然,堆排序的实现方法并不需要弹出元素,而是每轮将堆顶元素交换至数组尾部并缩小堆的长度。
+1 -1
View File
@@ -2,7 +2,7 @@
comments: true
---
# 9.3.   小结
# 8.3.   小结
- 堆是一棵完全二叉树,根据成立条件可分为大顶堆和小顶堆。大(小)顶堆的堆顶元素是最大(小)的。
- 优先队列的定义是具有出队优先级的队列,通常使用堆来实现。