通过查看其他博客的内容,整理一篇关于二进制霍夫曼编码的笔记供大家参考和讨论,如果有错误,欢迎大家联系我批评指正。
一、二进制霍夫曼的原理
我们可以将二进制霍夫曼编码拆分理解:
二进制即 0、1;
二进制编码就是用0和1的组合来表示其他字符;
霍夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法,通常用于无损数据压缩。(详见维基百科:/wiki/Huffman_coding#n-ary_Huffman_coding)
二、编码方法:
1.将信源中n个符号按概率分布的大小,以递减次序排列(降序排列);
2.用0和1分别分配给概率最小的两个信源符号,并将这两个概率最小的信源符号合并为一个新符号,并用这两个概率最小的信源符号合并成一个新符号,从而得到只包含n-1个符号的新信源,称其为缩减信源;
3.把缩减信源的符号仍按概率大小降序排列,再将最后两个概率最小的符号合并为一个新符号,并分别用0、1表示,这样又形成一个新的缩减信源;
4.按2、3步骤继续进行直到缩减信源最后只剩下两个符号位置。再将最后两个新符号分别用0和1表示。最后这两个符号的概率之和为1,然后从最后一级缩减信源开始,依编码路径右后向前返回,就可以得到各信源符号所对应的码符号序列,即对应的码字。
通过典型的两个例题来介绍。
例题一:字符串“alibaba”的二进制霍夫曼编码有多少位?
1.1计算符号的概率并进行降序排序。
符号
概率
a
3/7
b
2/7
i
1/7
l
1/7
1.2构建二叉树
1.3从根节点数,得到a、b、i、l 对应的码字。
符号
概率
编码
a
3/7
0
b
2/7
11
i
1/7
100
l
1/7
101
例题二:现有一段文言文,要通过二进制哈夫曼编码进行压缩。假设这段文言文只由4个汉字“之”“乎”“者”“也”组成,它们出现的次数分别为700、600、300、200。那么,“也”字的编码长度是?
同理,按照例题一的三个步骤进行就可以得到:
符号
概率
编码
之
700
0
乎
600
11
者
300
101
也
200
100
答:3位。
这道“之乎者也”没有像例题一一样出现相同的概率,但是其实保证字符的码字具有唯一性就行了。
例题三:字符串“ABCDADA”的二进制哈夫曼编码有多少位?
符号
概率
编码
A
3/7
0
D
2/7
10
C
1/7
111
B
1/7
110
所以字符串“ABCDADA”的二进制哈夫曼编码为(0110111100100),共13位。
出现次数越多的字符,编码越短;出现次数越少的字符,编码越长。这样就能让编码后的文件大小能够最短。