哈夫曼树与哈夫曼编码

1.定义

路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。
路径长度:路径上的分支数目称作路径长度。
树的路径长度:从树根到每一结点的路径长度之和。
权:赋予某个实体的一个量,是对实体的某个或某些属性的数值化描述。
结点的带权路径长度:从该结点到树根之间的路径长度与结点上权的乘积。
树的带权路径长度:树中所有叶子结点的带权路径长度之和。
哈夫曼树:假设有m个权值{w1,w2,…},可以构造一棵含n个叶子结点的二叉树,每个叶子结点的权为Wi,则其中带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树。
注:在哈夫曼树中,权值越大的结点离根结点越近。

2.构造过程

1、根据给定的n个权值,构造n棵只有根结点的二叉树,这n棵二叉树构成一个森林F。
2、在森林F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且新的二叉树根结点的权值为其左右子树上根结点的权值之和。
注:左子树的权值应小于右子树的权值。
3、从森林F中删除这两棵树,同时把新树加入到森林F中。
4、重复2,3步骤,直到森林中只有一棵树为止,这棵树便是哈夫曼树。

图示如下:
哈夫曼树与哈夫曼编码_第1张图片
注:哈夫曼树不唯一,唯一的只是带权路径长度之和最小。

3.哈弗曼编码

对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1,则从根到每个叶子的路径上,各分支的赋值分别构成一个二进制串,该二进制串就称为哈夫曼编码。
用图说明如下:

哈夫曼树与哈夫曼编码_第2张图片

A,B,C,D对应的哈夫曼编码分别为:111,10,110,0
注:哈夫曼编码不唯一,因为哈夫曼树不唯一

4.前缀编码

如果在一个编码方案中,任何一个编码都不是其它任何编码的前缀,则称编码是前缀编码。
哈弗曼编码满足性质:
1、哈夫曼编码是前缀编码。
因为哈夫曼编码对应路径的终点是叶子,所以任意哈夫曼码都不会与其他哈夫曼编码的前缀部分完全重叠。
2、哈夫曼编码是最优前缀编码
对于包括n个字符的数据文件,分别以它们的出现次数为权值构造哈夫曼树,利用该树对应的哈夫曼编码对文件进行编码,能使该文件压缩后对应的二进制文件的长度最短。

你可能感兴趣的:(数据结构与算法,哈夫曼树,哈夫曼编码)