哈夫曼树及应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用给定的n个权值构造森林,其中 包 含n棵只有根结点的二叉树
9 6
2
2
5
4
4
-14-
1、构造哈夫曼树(续)
9
2
5
4
6
2 4
-15-
1、构造哈夫曼树(续)
9
5
2
6
4
11 5 6
2
4
-16-
1、构造哈夫曼树(续)
9
5
6
2
11 5 6
4
2
4
-17-
1、构造哈夫曼树(续)
9 5 4 20 9 11
6
知识拓展
1、戴维·哈夫曼
(David A. Huffman 1925—1999)
美国计算机科学家
2、适应哈夫曼编码的数据压缩与解压技术研究
http://bbs.zdnet.com.cn/thread-880656-1-1.html
3、基于动态哈夫曼编码的XML数据流压缩技术
http://www.missyuan.com/thread-157230-1-1.html
1、算法思想
把字符出现频率作为二叉树叶子结点的 权值来构造字符的带权路径长度最小的二 叉树,构造原则: 把权值大的叶子结点距离树根近,反之 把权值小的结点距离树根远。
-11-
2 算法流程图
开始
初始化
用给定的n个权值 构造森林,其中 包 含n棵只有根结点 的二叉树 从森林中选取根的权值 最小的两棵二叉树作为 左右子树,构造一棵新 的二叉树根的权值是二 者根权的和 从森林F中删去这 两棵树,同时插入 刚生成的新树
-43-
9
5
A 9
4 D
B
-8-
WPL=9*1+2*3+5*3+4*2=38 C
2
5
一、哈夫曼树的定义
问题: 1. 什么样的树的带权路径长度是 最小的? 2. 如何构造带权路径长度最小的二 叉树?
-9-
6.5 哈夫曼树及哈夫曼编码
一、哈夫曼树的定义 二、哈夫曼树的构造
三、哈夫曼编码
-10-
二、哈夫曼树的构造
第三步:插入和删除
删除第一棵二叉树 删除第二棵二叉树
从森林F中 删去这两棵 树,同时插 入刚生成的 新树
插入新构造
的二叉树:
第四步:重复第二、三步
的二叉树
直到森林F中 只剩一棵二 叉树!
选择两棵最小
删除两棵最小
的二叉树
插入新构
造的二叉树
CrtHuffmanTree(HuffmanTree *ht , *HuffmanCode , *hc, int * w, int n)
电文总长度:(9+2+5+4)*2=40
第二种方案 A:0 B:01 C:1 D:10
电文总长度: 9*1+5*1+2*2+4*2=26
-21-
分析问题
第二种方案分析:
A:0
ABCAD
B:01
C:1 D:10
编码
0011010
译 码
AAC…或AB…
AACCACA
ABDD
-22-
AACDD
……
2、哈夫曼编码
9、2 3、结点A、B的权值: B 2 E D 4 C 5 T
F
A 9
4、结点A到根结点T的路径长度: 2 5、结点A的带权路径长度:9*2=18 6、树的带路径长度: 2*2+4*2+5*2+9*2=40
-5-
一、哈夫曼树的定义
哈夫曼树:由n个带权叶子结点构成的所有 二叉树中,带权路径长度WPL 最小的二叉树称之,哈夫曼树 又称最优二叉树。
6.5 哈夫曼树及其应用
课程导入
发送 通 信线 路
接收
aebaeced 100011010001110101 aebaeced 编码 译码
问题:
1、信息如何编码? 2、如何编码最短(传送效率高)? 3、收到信息如何译码?
-2-
产生背景
1951年,哈夫曼在MIT 学习信息论课程。 导师给的学期报告的题目: 寻找最有效的二进制编码 。
选取和构造 删除和插入

判断

结束
直到森林F中只剩 一棵二叉树?
1、构造哈夫曼树
假设一段电文总长度为20个字符,电文中仅 出现4个字符A,B,C,D 。4个字符的出现的次 数分别为9,2,5,4。 以这4个字符出现次数为权值,构造4个 叶子结点的一棵哈夫曼树?并为这段电文设 计二进制编码?
1、构造哈夫曼树
编码规定:左分支用“0”表示,右分支用“1”表示,
从根到叶子的路径上的“0”或“1”构成的二进制串。 0
Biblioteka Baidu20
0
1
A: 0 1
电文中字符最优编码
A
9
C
11
0
B: 111 C: 10 D: 110
5
D
6
B
1
4
2
0 A
20
0
1
9
C
11
0
1
5
D
6
B
1
4
2
D: 110
A: 0
B: 111
C: 10
哈夫曼编码总长度: 9*1+2*3+5*2+4*3=37 等长编码:每个字符用2位二进制,电文总 长度=2*20=40
哈 夫 曼 树 创 建 算 法 实 现
{ HuffmanTree ht; m=2*n-1; ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(i=1; i<=n; i++) ht[i] ={ w[i], 0, 0, 0}; for(i=n+1; i<=m; i++) ht[i] ={0, 0, 0, 0}; /*叶子、非叶子 结点初始化*/ for(i=n+1; i<=m; i++) /*创建非叶子结点, 建哈夫曼树*/ {/*在ht[1]~ht[i-1]的范围内选择两个weight最小 的结点,其序号分别赋值给s1、 s2返回*/ select(ht, i-1, s1, s2); ht[s1].parent=i; ht[s2].parent=i; ht[i].LChild=s1; ht[i].RChild=s2; ht[i].weight=ht[s1].weight+ht[s2].weight; } /*哈夫曼树建立完毕*/
}
思考题
怎样对哈夫曼编码进行译码?
-40-
本次课小结
重点: 1、理解哈夫曼树的定义 2、掌握哈夫曼树的构造方法 3、掌握哈夫曼编码 难点: 哈夫曼编码算法并上机实现
-41-
作业
理论作业: 假定用于通信的电文仅由 8 个字母 c1, c2, c3, c4, c5, c6, c7, c8 组成, 各字母在电文中出 现的频率分别为 5, 25, 3, 6, 10, 11, 36, 4。试 为这 8 个字母设计Huffman 编码, 并给出该电文 的总码数。 上机作业: 试为通信系统的信息收发站设计哈夫曼编码系 统,并上机调试验证。
哈夫曼编码能够使通常的数据 传输数量减少到最小。目前,哈 夫曼编码方法被广泛应用于数据 压缩和传输。
David A. Huffman 1925-1999) 美国计算机科学家。
-3-
6.5 哈夫曼树及应用
一、哈夫曼树的定义 二、哈夫曼树的构造
三、哈夫曼编码
-4-
相关知识
1、树的根结点:T 2、叶子结点:B、D、C、A
例2:
问题1:用一维数组存放哈夫曼树中的结点,n
个叶子结点的哈夫曼树的结点总数是多少?
问题2:每个结点应包含哪些信息?
构造算法:
2 3 5 7 8
第一步:初始化
(1)n个叶子结点初始化 (2)n-1个非叶子结点初始化
用给定的权值构造 一个森林F
第二步:选最小的两棵二叉树
从森林F中选取 根的权值最小的 两棵二叉树作为 左右子树,构造 一棵新的二叉树 根的权值是二者 根权的和
WPL wi li
i 1
n
说明:n是树中叶子结点的个数 wi是叶子结点的权值 li 是叶子结点到根结点的
路径长度
-6-
一、哈夫曼树的定义
T E B 2 D 4 C 5 F A 9
WPL=2*2+4*2+5*2+9*2=40
-7-
一、哈夫曼树的定义
B 2
4 D
A C
WPL=4*2+9*3+5*3+2*1=52
2
11 5 4
6
2
1、构造哈夫曼树(续)
9 5 4 20 9 11
6
2
11 5 4
6
2
三、哈夫曼编码的应用
例1:
假设一段电文总长度为20个字符,电文中仅 出现 四个字符A,B,C,D 。四个字符的出现的 次数分别为9,2,5,4(9+2+5+4=20)。 请为这段电文设计二进制编码?
分析问题
第一种方案 A:00 B:01 C:10 D:11
6.5 哈夫曼树及哈夫曼编码
一、哈夫曼树的定义 二、哈夫曼树的构造
三、哈夫曼编码和译码
-38-
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC, int *w,int n)
哈 { /*分配n个编码头指针*/ hcode=(HuffmanCode)malloc((n+1)*sizeof(char *)); 夫 cd=(char * )malloc(n * sizeof(char )); /*分配求当前编码的工作空间*/ cd[n-1]=′\0′;/*从右向左逐位存放编码, 首先存放编码结束符*/ 曼 for(i=1; i<=n; i++) /*求n个叶子结点对应的哈夫曼编码*/ 编 { start=n-1; /*初始化编码起始指针*/ for(c=i, p=ht[i].parent; p! =0; c=p, p=ht[p].parent) 码 /*从叶子到根结点求编码*/ if (ht[p].LChild==c) cd[--start]=′0′; /*左分支标0*/ 算 else cd[--start]=′1′; /*右分支标1*/ hcode[i]=(char *)malloc((n-start)*sizeof(char)); 法 /*为第i个编码分配空间*/ strcpy(hcode[i], &cd[start]); 实 } 现 free(cd);
相关文档
最新文档