Huffman树与Huffman编码

Huffman树与Huffman编码

Huffman树的定义

Huffman Tree(哈夫曼/霍夫曼树)即最优二叉树,特点为给定n个权值作为n个叶子结点构造一棵二叉树,使得带权路径长度达到最小。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

在树的基本定义中,树的带权路径长度为树中所有叶子结点的带权路径长度之和,通常记作:

WPL=i=1nwili

其中, n 为叶子结点的数目, wi 为叶子结点 i 的权值, li 为叶子结点 i 到根节点的路径长度。
带权路径长度WPL最小的二叉树称为哈夫曼树或最优二叉树。
例如下面三个树的叶子节点权重均为5,8,1,9
Huffman树与Huffman编码_第1张图片

Huffman树与Huffman编码_第2张图片

Huffman树与Huffman编码_第3张图片

其中树B的带权路径长度最小,即为Huffman树或最优二叉树。

Huffman树的构造

哈夫曼树的构造算法即为哈夫曼算法,步骤如下:
1. 根据给定的n个权值分别为 {w1,w2,,wn} 的节点构成二叉树集合 F={T1,T2,,Tn} ,其中每棵二叉树 Ti 中只有一个权为 wi 的根结点,其左右子树为空
2. 在F中选取两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左右子树根结点的权值之和
3. 在F中删除这两棵树,同时将新的二叉树加入F中
4. 重复2、3,直到F只含有一棵树为止

图示步骤如下:
1 单独叶子节点作为根节点集合
第1步

2-3 选取权重最小的两个树的根节点组成一个新树,新树的权重为两者之和
Huffman树与Huffman编码_第4张图片

2-3 选取权重最小的两个树的根节点组成一个新树,新树的权重为两者之和
Huffman树与Huffman编码_第5张图片

4 最终只剩下一棵树成为Huffman树
Huffman树与Huffman编码_第6张图片

Python 代码参考:https://github.com/nicktimko/huffman

Huffman编码及Huffman树的应用

Huffman Coding(哈夫曼编码)是Huffman Tree的一种应用,是一种可变字长编码(VLC),于1952年提出,依据字符出现概率来构造异字头的平均长度最短的码字,广泛地用于数据文件压缩,其压缩率通常在20%~90%之间。
深度阅读:
Huffman 编码压缩算法
哈夫曼树在判定问题中的应用
哈夫曼(huffman)树和哈夫曼编码

你可能感兴趣的:(Huffman树与Huffman编码)