Skip to content

Commit

Permalink
style(huffman-tree.md): optimize
Browse files Browse the repository at this point in the history
  • Loading branch information
Tiphereth-A committed Dec 14, 2024
1 parent a41622d commit 5b4c504
Showing 1 changed file with 21 additions and 23 deletions.
44 changes: 21 additions & 23 deletions docs/ds/huffman-tree.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,32 +37,30 @@ $$

### 正确性证明

**引理**: 最优前缀编码树(Huffman 树)中的权值最小的两个叶结点总是最深的叶结点,并且将这两个结点调整为兄弟结点至少不会破坏编码树的最优性。
???+ note "引理"
最优前缀编码树(Huffman 树)中的权值最小的两个叶结点总是最深的叶结点,并且将这两个结点调整为兄弟结点至少不会破坏编码树的最优性。

**证明**:

我们采用反证法来证明该命题。假设在一棵最优前缀编码树中,存在两个权值最小的叶结点,它们不是最深的叶结点。设这两个结点为 $a$ 和 $b$,且它们的深度小于某个最深的叶结点。对于这个最深的叶结点 $c$,我们可以将 $a$ 和 $c$ 交换位置,或将 $b$ 和 $c$ 交换位置。由于 Huffman 算法保证树的每一层按权值最小的叶结点合并,因此在交换后,树的带权路径长度(WPL)将减少。由此矛盾可得出假设不成立,因此权值最小的两个叶结点必须是最深的叶结点。

接下来,假设这两个权值最小的叶结点分别为 $a$ 和 $b$,它们的深度相同。如果在一棵最优前缀编码树中这两个结点不是兄弟结点,假设存在其他结点 $c$ 和 $d$ 与 $a$ 和 $b$ 分别是兄弟结点(假设 $a$ 和 $c$ 是兄弟结点,$b$ 和 $d$ 是兄弟结点)。我们可以将 $a$ 和 $b$ 合并为一个子树。

- 如果 $a$ 和 $b$ 合并后的权值之和小于 $c$ 或 $d$ 的权值,那么我们可以将合并后的子树与权值较大的结点(如 $c$ 或 $d$)合并,形成新的子树,WPL 会减少。
- 如果 $a$ 和 $b$ 的权值之和不小于 $c$ 和 $d$ 的权值,我们可以直接将 $a$ 和 $b$ 调整为兄弟结点,$c$ 和 $d$ 作为另一个兄弟结点,WPL 不会增加。

因此,经过这样的调整,最优性不会被破坏,得证。

**定理**: Huffman 算法得到的前缀编码树是最优前缀编码树。

**证明**:

我们使用数学归纳法来证明该定理。

- **基本情况**: 当字母数 $n = 2$ 时,显然,直接将两个字母合并成一棵树即为最优编码树。

- **归纳假设**: 假设对于字母数 $n = k$($k \geq 2$)时,Huffman 算法能够得到最优前缀编码树。
??? note "证明"
我们采用反证法来证明该命题。假设在一棵最优前缀编码树中,存在两个权值最小的叶结点,它们不是最深的叶结点。设这两个结点为 $a$ 和 $b$,且它们的深度小于某个最深的叶结点。对于这个最深的叶结点 $c$,我们可以将 $a$ 和 $c$ 交换位置,或将 $b$ 和 $c$ 交换位置。由于 Huffman 算法保证树的每一层按权值最小的叶结点合并,因此在交换后,树的带权路径长度(WPL)将减少。由此矛盾可得出假设不成立,因此权值最小的两个叶结点必须是最深的叶结点。

接下来,假设这两个权值最小的叶结点分别为 $a$ 和 $b$,它们的深度相同。如果在一棵最优前缀编码树中这两个结点不是兄弟结点,假设存在其他结点 $c$ 和 $d$ 与 $a$ 和 $b$ 分别是兄弟结点(假设 $a$ 和 $c$ 是兄弟结点,$b$ 和 $d$ 是兄弟结点)。我们可以将 $a$ 和 $b$ 合并为一个子树。

- 如果 $a$ 和 $b$ 合并后的权值之和小于 $c$ 或 $d$ 的权值,那么我们可以将合并后的子树与权值较大的结点(如 $c$ 或 $d$)合并,形成新的子树,WPL 会减少。
- 如果 $a$ 和 $b$ 的权值之和不小于 $c$ 和 $d$ 的权值,我们可以直接将 $a$ 和 $b$ 调整为兄弟结点,$c$ 和 $d$ 作为另一个兄弟结点,WPL 不会增加。

因此,经过这样的调整,最优性不会被破坏,得证。

- **归纳步骤**: 对于字母数 $n = k + 1$,我们从 $k+1$ 个字母中选出两个权值最小的字母,将它们合并为一棵子树,子树的根作为虚拟字母(虚拟结点)。根据引理可知,这一操作不会破坏前缀编码树的最优性。此时,虚拟字母与剩下的 $k$ 个字母一同构成 $k + 1$ 个字母,根据归纳假设,当字母数为 $k$ 时,Huffman 算法能够得到最优前缀编码树。
???+ note "定理"
Huffman 算法得到的前缀编码树是最优前缀编码树。

因此,通过数学归纳法,Huffman 算法对于任意字母数 $n$ 都能够得到最优前缀编码树,得证。
??? note "证明"
我们使用数学归纳法来证明该定理。

- **基本情况**: 当字母数 $n = 2$ 时,显然,直接将两个字母合并成一棵树即为最优编码树。
- **归纳假设**: 假设对于字母数 $n = k$($k \geq 2$)时,Huffman 算法能够得到最优前缀编码树。
- **归纳步骤**: 对于字母数 $n = k + 1$,我们从 $k+1$ 个字母中选出两个权值最小的字母,将它们合并为一棵子树,子树的根作为虚拟字母(虚拟结点)。根据引理可知,这一操作不会破坏前缀编码树的最优性。此时,虚拟字母与剩下的 $k$ 个字母一同构成 $k + 1$ 个字母,根据归纳假设,当字母数为 $k$ 时,Huffman 算法能够得到最优前缀编码树。

因此,通过数学归纳法,Huffman 算法对于任意字母数 $n$ 都能够得到最优前缀编码树,得证。

## 霍夫曼编码

Expand Down

0 comments on commit 5b4c504

Please sign in to comment.