二进制霍夫曼编码

通过查看其他博客的内容,整理一篇关于二进制霍夫曼编码的笔记供大家参考和讨论,如果有错误,欢迎大家联系我批评指正。

 

一、二进制霍夫曼的原理

我们可以将二进制霍夫曼编码拆分理解:

二进制即 0、1;

二进制编码就是用0和1的组合来表示其他字符;

霍夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法,通常用于无损数据压缩。(详见维基百科:https://en.wikipedia.org/wiki/Huffman_coding#n-ary_Huffman_coding)

 

二、编码方法:

1.将信源中n个符号按概率分布的大小,以递减次序排列(降序排列);

2.用0和1分别分配给概率最小的两个信源符号,并将这两个概率最小的信源符号合并为一个新符号,并用这两个概率最小的信源符号合并成一个新符号,从而得到只包含n-1个符号的新信源,称其为缩减信源

3.把缩减信源的符号仍按概率大小降序排列,再将最后两个概率最小的符号合并为一个新符号,并分别用0、1表示,这样又形成一个新的缩减信源;

4.按2、3步骤继续进行直到缩减信源最后只剩下两个符号位置。再将最后两个新符号分别用0和1表示。最后这两个符号的概率之和为1,然后从最后一级缩减信源开始,依编码路径右后向前返回,就可以得到各信源符号所对应的码符号序列,即对应的码字。

 (参考:https://wenku.baidu.com/view/1aeb40145b8102d276a20029bd64783e09127de5.html)

 

三、例题说明。

例题一:字符串“alibaba”的二进制霍夫曼编码有多少位?

1.1计算符号的概率并进行降序排序。

符号 概率
a 3/7
b 2/7
i 1/7
l 1/7

1.2构建二叉树 

                                                      二进制霍夫曼编码_第1张图片

 

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

                                                     二进制霍夫曼编码_第2张图片 

答:3位。 

这道“之乎者也”没有像例题一一样出现相同的概率,但是其实保证字符的码字具有唯一性就行了。

 

例题三:字符串“ABCDADA”的二进制哈夫曼编码有多少位?

符号 概率 编码
A 3/7 0
D 2/7 10
C 1/7 111
B 1/7 110

                                                       二进制霍夫曼编码_第3张图片        

所以字符串“ABCDADA”的二进制哈夫曼编码为(0110111100100),共13位。

 

出现次数越多的字符,编码越短;出现次数越少的字符,编码越长。这样就能让编码后的文件大小能够最短。

你可能感兴趣的:(算法)