哈夫曼树的基本概念
哈夫曼树的构造算法
哈夫曼树的构造示例
哈夫曼编码的基本概念
哈夫曼编码的程序实现
引言
假设要传送的字符为:ABACCDA
ASCII 码
可以使用 ASCII
编码每个字符占 8 个字节来进行编码
A:00001010
B:...
占用内存较多,这里不展开讨论
前缀码
若编码为:
A - 0
B - 00
C - 1
D - 01
那么就可以用 000011010
来表示,但是 0000
表示什么含义呢AAAA/ABA/BB
都是有可能的,这里就重码
了
关键
:要设计长度不等的编码,则必须使任一字符的编码都不是另一个字符的编码的前缀,这种编码称为前缀编码
哈夫曼编码
哈夫曼编码能够保证是前缀编码:因为没有一篇树叶是另一片树叶的祖先,所以每个叶结点的编码就不可能是其它叶结点编码的前缀
哈夫曼编码能够保证字符编码总长最短:因为哈夫曼树的带权路径长度最短,故字符编码的总长最短
这里就是哈夫曼编码的两个性质
- 哈夫曼编码是前缀码
- 哈夫曼编码是最优前缀码
哈夫曼编码实现的方法
- 统计字符集中每个字符在电文中出现的平均概率(概率越大,要求编码越短)
- 利用哈夫曼树的特点:权越大的叶子离根越近;
将每次字符的概率值作为权值,构造哈夫曼树
。则概率越大的结点,路径越短。 - 在哈夫曼树的每个分支上标上0 或 1:结点的
左分支标 0 ,右分支标 1
,把从根到每个叶子的路劲上的标号连接起来,作为该叶子代表的字符的编码
。
哈夫曼编码示例
示例一
假设要传输的字符集 Data = {C A S T ;}
字符出现的频率为 Weight = {2 4 2 3 3}
构造哈夫曼树
求哈夫曼编码
从上面的哈夫曼树中求出对应的哈夫曼编码如下
T 00
; 01
A 10
C 110
S 111
例如电文是:CAS;CAT;SAT;AT
则对应的哈夫曼编码使:11010111011101000011111000011000