哈夫曼编码的原理及c实现

哈夫曼编码的原理及c实现

ID:8834540

大小:46.67 KB

页数:4页

时间:2018-04-09

哈夫曼编码的原理及c实现_第1页
哈夫曼编码的原理及c实现_第2页
哈夫曼编码的原理及c实现_第3页
哈夫曼编码的原理及c实现_第4页
资源描述:

《哈夫曼编码的原理及c实现》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、哈夫曼编码的原理及C++实现哈夫曼编码(HuffmanCoding)是一种非常经典的编码方式,实现起来也很简单,在实际的笔试面试过程中有可能会遇到,这里介绍一下它的原理和一个使用优先队列的实现版本。一编码原理  哈夫曼编码是一种可变长的编码,它依据字符出现的概率来决定字符编码的长度,使得出现概率大的字符编码长度短,出现概率小的字符的编码长度长,于是可以减少整体的编码的长度。  哈弗曼编码时首先根据待编码的文本统计出每个字符出现的概率,组成初始的节点。然后每次取出概率最小的两个节点,新建一个节点,使得新建节点的左

2、右儿子为选取的两个节点,并且其概率是两个节点概率之和,把新建的节点再放进所有节点中重新选择最小的两个节点。重复此过程直到只剩一个节点,这个就是哈夫曼树的根节点。以下以字符串"aaaaaabbbbccddd"为例进行说明,为了方便,以字符出现的频数来代替频率(实际中通常使用的是频率,二者效果上是一样的),经过统计,可以知道每个字符出现的频数为abcd6423  具体建树过程如下:  (1)首先节点权值为6、4、2、3,选择最小的2和3,组成一个根节点为5的组合节点。  (2)当前节点权值为6、4、5,选择最小的4

3、和5,组成一个根节点为9的组合节点。  (3)当前节点权值为6、9,选择最小的6和9,组成一个根节点为15的组合节点。  (4)当前节点权值为15,只有一个节点,哈夫曼树建立完成。  图示如下:要从哈夫曼树得到每个字符的编码,只要在哈夫曼树中从根节点遍历到该字符节点,每次向左走时加一个0,向右走时加一个1,最终得到的字符串即为该字符的编码字符串。  如从上图可以看到,a的编码为0,b的编码为10,c的编码为110,d的编码为111。  当遇到一个新的字符串时,比如说"abcd",要对其编码,只需要把其中的每个字

4、符相应地替换成其编码字符串即可。  当已知一个编码后的字符串,比如说"010110111",要对其解码时,只需从左到右依次扫描该编码串,当读到的串在哈弗曼编码表里有对应的字符时即解码为该字符,然后继续扫描。  在这个例子中,读到第一个0时即可解码为a,读到10时可以解码为b,以此类推,最终得到解码后的结果为abcd。哈夫曼编码之所以可以这样解码,是因为它是一种前缀编码,任何一个字符的编码都不会是另一个字符编码的前缀。于是给定一个编码后的串,其解码的结果是唯一的。二代码实现  这里的哈夫曼树的节点主要包含两个成员

5、:字符及其频率,另外还必须有其左右儿子指针,父亲节点指针可以看情况添加,这里暂时不考虑。  为了方便,还添加了一个构造函数,可以给成员赋默认值。structnode//哈夫曼树节点{charch;//字符doublefreq;//出现频率node*lchild,*rchild;//左右儿子node(charc=0,doublef=0,node*l=NULL,node*r=NULL):ch(c),freq(f),lchild(l),rchild(r){}};  为了提高效率,程序中使用了STL中的优先队列来选择权

6、值最小的节点。队列的成员是节点的指针,为了选择权值最小的节点,需要自己定义比较的规则,以下是定义比较规则的仿函数,实质就是一个重载了括号运算符的类。  注意实现最小的权值优先,仿函数里应该使用的是大于运算。structcmp//仿函数,实现最小优先队列{booloperator()(node*&a,node*&b){returna->freq>b->freq;}};  然后是具体的建树过程。首先需要统计字符出现的次数,可以非常方便地使用STL的map实现。然后构造初始节点送入优先队列,再循环取出最小的两个节点,

7、生成新的节点放入队列。直到队列只剩一个节点,即为树的根节点。node*createTree(stringstr)//对一段文本构建哈夫曼树{//统计字符集及其出现频数mapcharSet;for(inti=0;i::iteratorp=charSet.begin();p!=charSet.end();p++)//cout<first<<""<secon

8、d<,cmp>que;for(map::iteratorp=charSet.begin();p!=charSet.end();p++)que.push(newnode(p->first,(double)p->second/str.length()));//每次取

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。