This commit is contained in:
krahets
2023-08-19 22:07:27 +08:00
parent 71c7786f51
commit 2e27ad1680
99 changed files with 283 additions and 283 deletions
+4 -4
View File
@@ -2,17 +2,17 @@
comments: true
---
# 8.2.   建堆操作
# 8.2   建堆操作
如果我们想要根据输入列表生成一个堆,这个过程被称为「建堆」。
## 8.2.1.   借助入堆方法实现
## 8.2.1   借助入堆方法实现
最直接的方法是借助“元素入堆操作”实现,首先创建一个空堆,然后将列表元素依次添加到堆中。
设元素数量为 $n$ ,则最后一个元素入堆的时间复杂度为 $O(\log n)$ 。在依次添加元素时,堆的平均长度为 $\frac{n}{2}$ ,因此该方法的总体时间复杂度为 $O(n \log n)$ 。
## 8.2.2.   基于堆化操作实现
## 8.2.2   基于堆化操作实现
有趣的是,存在一种更高效的建堆方法,其时间复杂度仅为 $O(n)$ 。我们先将列表所有元素原封不动添加到堆中,**然后迭代地对各个节点执行“从顶至底堆化”**。当然,**我们不需要对叶节点执行堆化操作**,因为它们没有子节点。
@@ -191,7 +191,7 @@ comments: true
}
```
## 8.2.3.   复杂度分析
## 8.2.3   复杂度分析
为什么第二种建堆方法的时间复杂度是 $O(n)$ ?我们来展开推算一下。