哈夫曼编码详解

哈夫曼编码详解

暗道里能听懂

背景

成绩录入的时候,常常会遇到这种情况(可能没多少学校会这么干)

vBEa6g.png

上图中,如果说数据足够多,且都集中于良好的话,每一次录入就需要更多的时间。并且有些时候分支不止这么点。

路径长度

这个时候,我们就需要让数据大的分支与根节点靠近一点。这里再引入一个概念————路径长度。在一棵树中,一个节点向下,与可以达到的子孙之间的通路成为路径。路径中的分支数成为路径长度。下图中,1 到 5的路径长度为 2。当然也可以这么记,路径长度 = 终止层数 - 起始层数。

树.png

那么当每个节点都带有权时,我们要想办法让权大的路径长度小(默认起点为根节点)。这里我们规定:节点的带权路径长度为:从根节点到该节点之间路径长度与该节点的权值乘积。

哈夫曼树的含义

这就回到了文章开头的背景:要让录入成绩效率最高,我们就要构造一棵所有点的带权路径长度最小的树。这样的树,我们就称之为哈夫曼树。

显然,权值越大,越要靠根节点。那么我们可以采用以下建法:

  1. 将 n 个节点看做是 n 棵子树,权值为 , , , …, .选取其中根节点权值最小的两个子树,合并为一棵树。两个子树分别为左右子树,根节点权值为两节点之和
  2. 删除两棵被合并的子树,加入新树
  3. 重复上述步骤,知道只剩下一棵树。

再下面这图应该更好理解。

屏幕截图 2022-08-17 105024.png

哈夫曼树的构建运用了贪心的思想

应用:哈弗曼编码

为了一些特殊的用途(如间谍),我们需要将字母或符号转化为01编码。

因为01编码很长,我们要保证不产生歧义。例如 A 的编码是 10, B 是 1, C 是 0。那么101,就会有多个解读:AB? BCB? 关键是必须使任一字符的编码都不是另一字符的编码的前缀。

译码过程:先统计每个字符出现个数,然后构建一个哈夫曼树。

接下来从根节点出发,左0 右1。

哈夫曼编码1.PNG

完结撒花

2022-8-17 11:14:50