Unify punctuation.

This commit is contained in:
krahets
2023-07-26 08:59:36 +08:00
parent 35973068a7
commit 63a0e73df0
46 changed files with 201 additions and 201 deletions

View File

@@ -82,8 +82,8 @@
为什么第二种建堆方法的时间复杂度是 $O(n)$ ?我们来展开推算一下。
- 完全二叉树中,设节点总数为 $n$ ,则叶节点数量为 $(n + 1) / 2$ ,其中 $/$ 为向下整除。因此,在排除叶节点后,需要堆化的节点数量为 $(n - 1)/2$ ,复杂度为 $O(n)$
- 在从顶至底堆化的过程中,每个节点最多堆化到叶节点,因此最大迭代次数为二叉树高度 $O(\log n)$
- 完全二叉树中,设节点总数为 $n$ ,则叶节点数量为 $(n + 1) / 2$ ,其中 $/$ 为向下整除。因此,在排除叶节点后,需要堆化的节点数量为 $(n - 1)/2$ ,复杂度为 $O(n)$
- 在从顶至底堆化的过程中,每个节点最多堆化到叶节点,因此最大迭代次数为二叉树高度 $O(\log n)$
将上述两者相乘,可得到建堆过程的时间复杂度为 $O(n \log n)$ 。**然而,这个估算结果并不准确,因为我们没有考虑到二叉树底层节点数量远多于顶层节点的特性**。

View File

@@ -2,8 +2,8 @@
「堆 Heap」是一种满足特定条件的完全二叉树可分为两种类型
- 「大顶堆 Max Heap」任意节点的值 $\geq$ 其子节点的值
- 「小顶堆 Min Heap」任意节点的值 $\leq$ 其子节点的值
- 「大顶堆 Max Heap」任意节点的值 $\geq$ 其子节点的值
- 「小顶堆 Min Heap」任意节点的值 $\leq$ 其子节点的值
![小顶堆与大顶堆](heap.assets/min_heap_and_max_heap.png)
@@ -630,9 +630,9 @@
堆顶元素是二叉树的根节点,即列表首元素。如果我们直接从列表中删除首元素,那么二叉树中所有节点的索引都会发生变化,这将使得后续使用堆化修复变得困难。为了尽量减少元素索引的变动,我们采取以下操作步骤:
1. 交换堆顶元素与堆底元素(即交换根节点与最右叶节点)
2. 交换完成后,将堆底从列表中删除(注意,由于已经交换,实际上删除的是原来的堆顶元素)
3. 从根节点开始,**从顶至底执行堆化**
1. 交换堆顶元素与堆底元素(即交换根节点与最右叶节点)
2. 交换完成后,将堆底从列表中删除(注意,由于已经交换,实际上删除的是原来的堆顶元素)
3. 从根节点开始,**从顶至底执行堆化**
顾名思义,**从顶至底堆化的操作方向与从底至顶堆化相反**,我们将根节点的值与其两个子节点的值进行比较,将最大的子节点与根节点交换;然后循环执行此操作,直到越过叶节点或遇到无需交换的节点时结束。

View File

@@ -30,10 +30,10 @@
我们可以基于堆更加高效地解决 Top-K 问题,流程如下:
1. 初始化一个小顶堆,其堆顶元素最小
2. 先将数组的前 $k$ 个元素依次入堆
3. 从第 $k + 1$ 个元素开始,若当前元素大于堆顶元素,则将堆顶元素出堆,并将当前元素入堆
4. 遍历完成后,堆中保存的就是最大的 $k$ 个元素
1. 初始化一个小顶堆,其堆顶元素最小
2. 先将数组的前 $k$ 个元素依次入堆
3. 从第 $k + 1$ 个元素开始,若当前元素大于堆顶元素,则将堆顶元素出堆,并将当前元素入堆
4. 遍历完成后,堆中保存的就是最大的 $k$ 个元素
=== "<1>"
![基于堆寻找最大的 k 个元素](top_k.assets/top_k_heap_step1.png)