哈夫曼编码与译码
一、哈夫曼编码定义
1.1、基本术语
路径: 从一结点到另一结点上的分支构成这两个结点的路径。
路径长度: 路径上的分支数目。
树的路径长度: 从根到所有结点的路径长度之和。
结点的带权路径长度: 从该结点到树根之间的路径长度与结点上权值的乘积。
树的带权路径长度: 树中所有叶子结点的带权路径长度之和。
1.2、哈夫曼树定义: 设有n 个权值 {w1,w2,......wn},试构造具有 n 个叶结点的二叉树,每个叶结点权值为 wi ,则其中带权路径长度WPL最小的二叉树称为哈夫曼树(最优二叉树)。特点:权值越大的叶子离根越近。若叶结点上的权值均相同,则完全二叉树一定是最优二叉树,否则完全二叉树不一定是最优二叉树。
WPL=2*(7+5+2+4)=36
WPL=3*(7+5)+2*4+2=46
WPL=3*(2+4)+2*5+7=35
1.3、哈夫曼树构造:
(1) 根据给定的n个权值 {w1,w2,......wn}, 生成 n 棵二叉树的集合F= {T1,T2,.......Tm};其中每棵二叉树Ti只有一个带权为Wi的根结点,左右子树为空。
(2) 在 F 中选择两棵根结点值最小的树 Ti ,Tj 作为左右子树,构成一棵新二叉树Tk , Tk根结点值为Ti ,Tj根结点权值之和;
(3) 在 F 中删除Ti ,Tj ,并把 Tk 加到 F中;
(4) 重复 (2) (3),直到 F中只含一棵树。
例:w={7,5,2,4}
1.4、哈夫曼编码
数据的压缩过程称为编码,解压过程称为解码。
编码:将文件中的字符转换为唯一的一个二进制串。
解码:将一个二进制串转换为对应的字符。
定长编码:设编码字符个数为n,码长为k,则k=上界(log2^(n+1))。
不等长编码:使出现频率最多的字符采用尽可能短的编码。
前缀编码:对不等长编码,要求任一字符的编码都不是另一个字符的编码的前缀。
采用二叉树设计前缀编码:用二叉树的叶结点表示待编码的字符,并约定左分支表示字符‘0’,右分支表示字符‘1’,则从根结点到叶子结点的路径上分支字符组成的字符串作为该叶子结点的编码。由此得到的编码必为二进制的前缀编码。
方法:以n种字符出现的频率作权,设计一棵哈夫曼树,由此得到字符的二进制前缀编码为总长最短的二进制前缀编码,这种编码即为哈夫曼编码。
二、实验实现
2.1、实验内容
哈夫曼编码生成与译码。
输入符号(序号用英文字母A, B, C, …表示)以及各符号出现概率,以字符串形式输出各符号对应的二进制哈夫曼编码。
以字符串形式输入接收到的比特序列,输出译码后的符号序列。建议用菜单形式提供功能。
2.2、输入与输出