This commit is contained in:
krahets
2023-04-17 18:24:20 +08:00
parent ade482858a
commit 261332f372
26 changed files with 398 additions and 853 deletions
+3 -3
View File
@@ -2,11 +2,11 @@
comments: true
---
# 8.2.   建堆操作 *
# 9.2.   建堆操作 *
如果我们想要根据输入列表生成一个堆,这个过程被称为「建堆」。
## 8.2.1.   两种建堆方法
## 9.2.1.   两种建堆方法
### 借助入堆方法实现
@@ -155,7 +155,7 @@ comments: true
}
```
## 8.2.2.   复杂度分析
## 9.2.2.   复杂度分析
为什么第二种建堆方法的时间复杂度是 $O(n)$ ?我们来展开推算一下。
+4 -4
View File
@@ -2,7 +2,7 @@
comments: true
---
# 8.1.   堆
# 9.1.   堆
「堆 Heap」是一种满足特定条件的完全二叉树,可分为两种类型:
@@ -19,7 +19,7 @@ comments: true
- 我们将二叉树的根节点称为「堆顶」,将底层最靠右的节点称为「堆底」。
- 对于大顶堆(小顶堆),堆顶元素(即根节点)的值分别是最大(最小)的。
## 8.1.1.   堆常用操作
## 9.1.1.   堆常用操作
需要指出的是,许多编程语言提供的是「优先队列 Priority Queue」,这是一种抽象数据结构,定义为具有优先级排序的队列。
@@ -307,7 +307,7 @@ comments: true
```
## 8.1.2.   堆的实现
## 9.1.2.   堆的实现
下文实现的是大顶堆。若要将其转换为小顶堆,只需将所有大小逻辑判断取逆(例如,将 $\geq$ 替换为 $\leq$ )。感兴趣的读者可以自行实现。
@@ -1276,7 +1276,7 @@ comments: true
}
```
## 8.1.3.   堆常见应用
## 9.1.3.   堆常见应用
- **优先队列**:堆通常作为实现优先队列的首选数据结构,其入队和出队操作的时间复杂度均为 $O(\log n)$ ,而建队操作为 $O(n)$ ,这些操作都非常高效。
- **堆排序**:给定一组数据,我们可以用它们建立一个堆,然后依次将所有元素弹出,从而得到一个有序序列。当然,堆排序的实现方法并不需要弹出元素,而是每轮将堆顶元素交换至数组尾部并缩小堆的长度。
+1 -1
View File
@@ -2,7 +2,7 @@
comments: true
---
# 8.3.   小结
# 9.3.   小结
- 堆是一棵完全二叉树,根据成立条件可分为大顶堆和小顶堆。大(小)顶堆的堆顶元素是最大(小)的。
- 优先队列的定义是具有出队优先级的队列,通常使用堆来实现。