Add Zig code blocks.

This commit is contained in:
Yudong Jin
2023-02-01 22:03:04 +08:00
parent 6cd6d5589e
commit 7ce7386bab
25 changed files with 599 additions and 0 deletions
+36
View File
@@ -203,6 +203,12 @@ comments: true
// Swift 未提供内置 heap 类
```
=== "Zig"
```zig title="heap.zig"
```
## 8.1.3. 堆的实现
下文实现的是「大顶堆」,若想转换为「小顶堆」,将所有大小逻辑判断取逆(例如将 $\geq$ 替换为 $\leq$ )即可,有兴趣的同学可自行实现。
@@ -340,6 +346,12 @@ comments: true
}
```
=== "Zig"
```zig title="my_heap.zig"
```
### 访问堆顶元素
堆顶元素是二叉树的根结点,即列表首元素。
@@ -407,6 +419,12 @@ comments: true
}
```
=== "Zig"
```zig title="my_heap.zig"
```
### 元素入堆
给定元素 `val` ,我们先将其添加到堆底。添加后,由于 `val` 可能大于堆中其它元素,此时堆的成立条件可能已经被破坏,**因此需要修复从插入结点到根结点这条路径上的各个结点**,该操作被称为「堆化 Heapify」。
@@ -553,6 +571,12 @@ comments: true
}
```
=== "Zig"
```zig title="my_heap.zig"
```
### 堆顶元素出堆
堆顶元素是二叉树根结点,即列表首元素,如果我们直接将首元素从列表中删除,则二叉树中所有结点都会随之发生移位(索引发生变化),这样后续使用堆化修复就很麻烦了。为了尽量减少元素索引变动,采取以下操作步骤:
@@ -758,6 +782,12 @@ comments: true
}
```
=== "Zig"
```zig title="my_heap.zig"
```
### 输入数据并建堆 *
如果我们想要直接输入一个列表并将其建堆,那么该怎么做呢?最直接地,考虑使用「元素入堆」方法,将列表元素依次入堆。元素入堆的时间复杂度为 $O(n)$ ,而平均长度为 $\frac{n}{2}$ ,因此该方法的总体时间复杂度为 $O(n \log n)$ 。
@@ -843,6 +873,12 @@ comments: true
}
```
=== "Zig"
```zig title="my_heap.zig"
```
那么,第二种建堆方法的时间复杂度时多少呢?我们来做一下简单推算。
- 完全二叉树中,设结点总数为 $n$ ,则叶结点数量为 $(n + 1) / 2$ ,其中 $/$ 为向下整除。因此在排除叶结点后,需要堆化结点数量为 $(n - 1)/2$ ,即为 $O(n)$