mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-22 08:17:15 +00:00
build
This commit is contained in:
@@ -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)$ ?我们来展开推算一下。
|
||||
|
||||
|
||||
@@ -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)$ ,这些操作都非常高效。
|
||||
- **堆排序**:给定一组数据,我们可以用它们建立一个堆,然后依次将所有元素弹出,从而得到一个有序序列。当然,堆排序的实现方法并不需要弹出元素,而是每轮将堆顶元素交换至数组尾部并缩小堆的长度。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
comments: true
|
||||
---
|
||||
|
||||
# 9.3. 小结
|
||||
# 8.3. 小结
|
||||
|
||||
- 堆是一棵完全二叉树,根据成立条件可分为大顶堆和小顶堆。大(小)顶堆的堆顶元素是最大(小)的。
|
||||
- 优先队列的定义是具有出队优先级的队列,通常使用堆来实现。
|
||||
|
||||
Reference in New Issue
Block a user