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