哈夫曼编码理解

来源:互联网 发布:java while写99乘法表 编辑:程序博客网 时间:2024/05/17 01:50

哈夫曼编码

哈夫曼编码将频繁出现的字符采用短编码,出现频率较低的字符采用长编码。具体的操作过程为

     i.以每个字符的出现频率作为关键字构建最小优先队列;

    ii.去除关键字最小的两个结点生成子树,根结点的关键字为孩子结点关键字之和,并将根结点插入到最小优先队列中,直至得到一颗最优编码树。

哈夫曼编码方案是基于________策略的,用该方案对包含a~f留个字符的文件进行编码,文件包含100000个字符,每个字符的出现频率(用百分比表示)如下表所示,则与固定长度编码相比,改编码方案节省了______存储空间。

字符

a

b

c

d

e

F

出现频率

18

32

4

8

12

26

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

同时哈夫曼编码是典型的贪心算法.

哈夫曼编码 

     最优编码树如上:

     生成最优编码树

          先将上述表中字符按出现频率大小排序,结果如下

             

字符

B

F

A

E

D

C

出现频率

32

26

18

12

8

4

                        i.将最小的2个字符出现的频率填入二叉树的左孩和右孩中,同时将左右孩之和填入父节点中

                      ii.将父节点作为右孩填入二叉树,同时将剩余字符出现频率最小的填入左孩中,同时将左右孩之和填入父节点中

                     iii.重复II操作,直至无字符

 

     字符编码

从上至下,从左到右,遵循以下规则依次编码;

                        i.左孩编码末尾为0,右孩编码末尾为1;

                      ii.每增加一层,编码位数增加1

故编码最长位数为哈夫曼二叉树层数减一(编码从第二层开始)

 

     编码效率比较

         原编码:

              有6个字符,故需要3位字节长度。(2^3>6),所以需要3*100000=300000

         哈夫曼编码:

              (1*0.32+2*0.26+3*0.18+4*0.12+5*0.04+5*0.08)*100000=246000

         节省1-246000/300000=0.18

 

     其他应用(待完成)

0 0
原创粉丝点击