这一篇要总结的是树中的最后一种,即哈夫曼树,我想从以下几点对其进行总结:
1,什么是哈夫曼树?
2,如何构建哈夫曼树?
3,哈夫曼编码?
4,算法实现?
一,什么是哈夫曼树
什么是哈夫曼树呢?
哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明。
它们的带权路径长度分别为:
图a: WPL=5*2+7*2+2*2+13*2=54
图b: WPL=5*3+2*3+7*2+13*1=48
可见,图b的带权路径长度较小,我们可以证明图b就是哈夫曼树(也称为最优二叉树)。
二,如何构建哈夫曼树
一般可以按下面步骤构建:
1,将所有左,右子树都为空的作为根节点。
2,在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,且置新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。
3,从森林中删除这两棵树,同时把新树加入到森林中。
4,重复2,3步骤,直到森林中只有一棵树为止,此树便是哈夫曼树。
下面是构建哈夫曼树的图解过程:
三,哈夫曼编码
利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子节点都有一条路径,对路径上的各分支约定指向左子树的分支表示”0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为各个叶子节点对应的字符编码,即是哈夫曼编码。
就拿上图例子来说:
A,B,C,D对应的哈夫曼编码分别为:111,10,110,0
用图说明如下:
记住,设计电文总长最短的二进制前缀编码,就是以n个字符出现的频率作为权构造一棵哈夫曼树,由哈夫曼树求得的编码就是哈夫曼编码。
摘自http://www.cnblogs.com/mcgrady/p/3329825.html#_label0
在电报通讯中,电文是以二进制的0、1序列传送的。字符集中的字符的使用频率是不同的(比如e和t的使用较之q和z要频繁得多),哈夫曼编码可以使得编码的总长最短,从而相同的位长可以传送更多的信息。
本程序以下面的字符及使用频率为例:
字符 | 权值 |
a | 0.12 |
b | 0.40 |
c | 0.15 |
d | 0.08 |
e | 0.25 |
首先建立哈夫曼树:
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
tree[i].ch | a | b | c | d | e | | | | |
tree[i].weight | 0.12 | 0.40 | 0.15 | 0.08 | 0.25 | 0.20 | 0.35 | 0.60 | 1.00 |
tree[i].parent | 5 | 8 | 6 | 5 | 7 | 6 | 7 | 8 | 0 |
tree[i].lchild | -1 | -1 | -1 | -1 | -1 | 3 | 2 | 4 | 1 |
tree[i].rchild | -1 | -1 | -1 | -1 | -1 | 0 | 5 | 6 | 7 |
得到哈夫曼树和哈夫曼编码如下:
下面是哈夫曼编码的存储结构:
序号 | bits | ch | start | |||
0 | 1 | 1 | 1 | 1 | a | 2 |
1 | | | | 0 | b | 5 |
2 | | 1 | 1 | 0 | c | 3 |
3 | 1 | 1 | 1 | 0 | d | 2 |
4 | | | 1 | 0 | e | 4 |
程序清单如下:
#include<stdio.h>
#define n 5
#define m (2*n-1)
#define maxval 10000.0
#define maxsize 100
typedef struct
{
}hufmtree;
typedef struct
{
}codetype;
void huffman(hufmtree tree[]);//建立哈夫曼树
void huffmancode(codetype code[],hufmtree tree[]);//根据哈夫曼树求出哈夫曼编码
void decode(hufmtree tree[]);//依次读入电文,根据哈夫曼树译码
void main()
{
}
void huffman(hufmtree tree[])//建立哈夫曼树
{
}//huffman
void huffmancode(codetype code[],hufmtree tree[])//根据哈夫曼树求出哈夫曼编码
//codetype code[]为求出的哈夫曼编码
//hufmtree tree[]为已知的哈夫曼树
{
}//huffmancode
void decode(hufmtree tree[])//依次读入电文,根据哈夫曼树译码
{
}//decode
贴出一例运行结果:
摘自http://blog.sina.com.cn/s/blog_686d0fb001012qmh.html