Huffman树
来源:互联网 发布:什么是linux发行版 编辑:程序博客网 时间:2024/05/29 21:32
1 Huffman树
Huffman树又称最优二叉树,是一类带权路径长度最短的树。
路径是指从树中一个节点到另一个节点之间的通路,路径上的分支数目称为路径长度。
树的路径长度为从树根到每个叶节点之间的路径长度之和。
节点的带权路径长度为从该节点到树根之间的路径长度与该节点权的乘积。
树的带权路径长度为树中所有叶节点的带权路径长度之和。
2 构造Huffman树的算法
1 给定n个节点的集合,每个节点都带权值,构成n棵二叉树集合,其左右子树均空。
2 选两棵根节点权值最小的树作为左右子树构造一棵新的二叉树,新的二叉树的根节点的权值就是左右子树根节点权值之和。
3 从n个节点中删除刚才使用的两个节点,同时将新产生的二叉树的根节点放在节点集合中。
4 重复2,3,直到只有一棵树为止。这棵树就是最优二叉树。
3 Huffman树的应用
Huffman树的典型应用就是Huffman编码。根据Huffman树的特性,其编码是最优前缀码,编码效率较高。
在编码过程中要考虑两个问题,一是数据的最小冗余编码问题,二是译码的唯一性问题。在实际应用中,各个编码的字符的出现频率不同,希望用最短的编码来表示出现频率大的字符而用较长的编码来表示出现频率较少的字符,从而使整个编码序列的总长度最小,这就是最小冗余编码问题,Huffman编码就解决了这个问题。根据权值或概率的大小来构建Huffman树,然后左分支用0表示而右分支用1表示,就形成了编码序列,每个叶节点的编码就是从根节点到叶节点的路径上的“0”“1”序列。
Huffman树译码的过程为:从根节点出发,按字符串中的0,1确定是进入左分支还是进入右分支,当到达叶节点时译出该叶节点对应的字符。若电文未结束,则回到根节点继续进行上述过程。
4 数据结构
#define MAXLEAFNUM 20
struct node{
char ch; //当前节点表示的字符,对于非叶子节点,此域不用
int weight; //当前节点的权值
int parent; //当前节点的父节点下标,为0时表示无父节点
int lchild,rchild; //当前节点的左右孩子节点,为0时表示无孩子节点
}Ht[2*MAXLEAFNUM];
基本术语
编辑本段构造
哈夫曼树的构造
编辑本段应用
- Huffman树&&Huffman编码
- Huffman树
- Huffman 树
- huffman树
- huffman 树
- Huffman树
- Huffman树
- Huffman树
- Huffman树
- Huffman树
- Huffman树
- Huffman树
- Huffman树
- Huffman树
- huffman 树
- Huffman树
- Huffman树
- Huffman树
- 程序员面试宝典第二版87页勘误
- Oracle11g 新的后台进程的功能
- 推荐几本书,给产品经理同学
- 什么最重要?
- pcre_exec()详解
- Huffman树
- Busybox下tftp命令使用详解
- EXt用到时间轴曲线图例子:
- [Java][ibatis]ibatis批量处理+多表关联查询
- VBS获取服务的信息
- MFC消息映射BEGIN_MESSAGE_MAP详解
- Android开发 绘制曲线图 AchartEngine使用
- C++中的空类,默认产生哪些类成员函数
- nyoj-540-奇怪的排序