不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵!
哈夫曼编码和哈夫曼树
哈夫曼编码
概念
- 又称
霍夫曼编码
,是一种编码方式
,可变字长编码(VLC
)的一种。 - 依据
字符出现概率
来构造异字头的平均长度最短
的码字,称之为最佳编码
。
目的
根据使用频率来最大化的节省字符(编码)的存储空间
。用于加密解密
。
编码思想
核心思想:按照出现频率进行构造树,令出现频率大的节点靠近根节点。
- 以五个字符(
A
,B
,C
,D
,E
)为例子,它们的频率分别是5
,4
,3
,2
,1
。
-
选取其中频率最小的两个节点,构造二叉树,它们的父结点频率是它们的频率和。
-
将父结点加入原先的集合中,集合变成{5,4,3,3},再选取其中的最小两个。
-
第三次变为{5,4,6},继续选取最小两个。
-
第四次变成{9,6},只剩下两个了,连起来当作左右子树即可。
- 到A的编码是11,B的编码是10,C的编码是00,D的编码是011,E的编码是010。
- 所以可以看出,频率大的节点,编码越短,这就是最优编码之称的来历。
- 带权路径值 = 每个叶子节点的值 * 节点所在的层数(根节点为0)之和。
- 所以频率越大的节点距离根越近,表示该方法构造的树的带权路径值最短,即为最优二叉树。
哈夫曼树
概念
- 即
最优二叉树
:带权路径长度值最小的树。 - 即
效率最高
的判别树
:用于描述分类过程的二叉树。 - 又称
赫夫曼树
、霍夫曼树
。
目的
- 用哈夫曼树设计总长最短的二进制前缀编码,即哈夫曼编码。
注意点
- 满二叉树不一定是哈夫曼树。
- 哈夫曼树中权越大的叶子离根越近 (很好理解,
WPL
最小的二叉树) - 具有相同带权结点的哈夫曼树不唯一。
- 哈夫曼树的结点的度数为
0
或2
, 没有度为1
的结点。 - 包含
n
个叶子结点的哈夫曼树中共有2n – 1
个结点。 - 包含
n
棵树的森林要经过n–1
次合并才能形成哈夫曼树,共产生n–1
个新结点。