Huffman树与Huffman编码
Huffman树的定义
Huffman Tree(哈夫曼/霍夫曼树)即最优二叉树,特点为给定n个权值作为n个叶子结点构造一棵二叉树,使得带权路径长度达到最小。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
在树的基本定义中,树的带权路径长度为树中所有叶子结点的带权路径长度之和,通常记作:
其中, n 为叶子结点的数目,
带权路径长度WPL最小的二叉树称为哈夫曼树或最优二叉树。
例如下面三个树的叶子节点权重均为5,8,1,9
其中树B的带权路径长度最小,即为Huffman树或最优二叉树。
Huffman树的构造
哈夫曼树的构造算法即为哈夫曼算法,步骤如下:
1. 根据给定的n个权值分别为
2. 在F中选取两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左右子树根结点的权值之和
3. 在F中删除这两棵树,同时将新的二叉树加入F中
4. 重复2、3,直到F只含有一棵树为止
图示步骤如下:
1 单独叶子节点作为根节点集合
2-3 选取权重最小的两个树的根节点组成一个新树,新树的权重为两者之和
2-3 选取权重最小的两个树的根节点组成一个新树,新树的权重为两者之和
4 最终只剩下一棵树成为Huffman树
Python 代码参考:https://github.com/nicktimko/huffman
Huffman编码及Huffman树的应用
Huffman Coding(哈夫曼编码)是Huffman Tree的一种应用,是一种可变字长编码(VLC),于1952年提出,依据字符出现概率来构造异字头的平均长度最短的码字,广泛地用于数据文件压缩,其压缩率通常在20%~90%之间。
深度阅读:
Huffman 编码压缩算法
哈夫曼树在判定问题中的应用
哈夫曼(huffman)树和哈夫曼编码