欢迎来到天天文库
浏览记录
ID:57643087
大小:31.67 KB
页数:10页
时间:2020-08-29
《压缩代码非常简单.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、压缩代码非常简单,首先用ASCII值初始化511个哈夫曼节点:CHuffmanNodenodes[511];for(intnCount=0;nCount<256;nCount++)nodes[nCount].byAscii=nCount;然后,计算在输入缓冲区数据中,每个ASCII码出现的频率:for(nCount=0;nCount2、,获取每个ASCII码对应的位序列:intnNodeCount=GetHuffmanTree(nodes);构造哈夫曼树非常简单,将所有的节点放到一个队列中,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点就是两个被替换节点的父节点了。如此循环,直到队列中只剩一个节点(树根)。//parentnodepNode=&nodes[nParentNode++];//popfirstchildpNode->pLeft=PopNode(pNodes,nBackNode--,false);//popsecondchildpNode->pRight=PopNo3、de(pNodes,nBackNode--,true);//adjustparentofthetwopopednodespNode->pLeft->pParent=pNode->pRight->pParent=pNode;//adjustparentfrequencypNode->nFrequency=pNode->pLeft->nFrequency+pNode->pRight->nFrequency;这里我用了一个好的诀窍来避免使用任何队列组件。我先前就直到ASCII码只有256个,但我分配了511个(CHuffmanNodenodes[511]),前255个记录ASCII码,而4、用后255个记录哈夫曼树中的父节点。并且在构造树的时候只使用一个指针数组(ChuffmanNode*pNodes[256])来指向这些节点。同样使用两个变量来操作队列索引(intnParentNode=nNodeCount;nBackNode=nNodeCount–1)。接着,压缩的最后一步是将每个ASCII编码写入输出缓冲区中:intnDesIndex=0;//looptowritecodesfor(nCount=0;nCount>3))5、=nodes[pSrc[nCount]].dw6、Code<<(nDesIndex&7);nDesIndex+=nodes[pSrc[nCount]].nCodeLength;}(nDesIndex>>3):>>3以8位为界限右移后到达右边字节的前面(nDesIndex&7):&7得到最高位.注意:在压缩缓冲区中,我们必须保存哈夫曼树的节点以及位序列,这样我们才能在解压缩时重新构造哈夫曼树(只需保存ASCII值和对应的位序列)。解压缩解压缩比构造哈夫曼树要简单的多,将输入缓冲区中的每个编码用对应的ASCII码逐个替换就可以了。只要记住,这里的输入缓冲区是一个包含每个ASCII值的编码的位流。因此,为了用ASCII值替换编码,我们必7、须用位流搜索哈夫曼树,直到发现一个叶节点,然后将它的ASCII值添加到输出缓冲区中:intnDesIndex=0;DWORDnCode;while(nDesIndex>3)))>>(nSrcIndex&7);pNode=pRoot;while(pNode->pLeft){pNode=(nCode&1)?pNode->pRight:pNode->pLeft;nCode>>=1;nSrcIndex++;}pDes[nDesIndex++]=pNode->byAscii;}过程#include8、o.h>#include#include#include#include#defineM10typedefstructFano_Node{charch;floatweight;}FanoNode[M];typedefstructnode{intstart;intend;structnode*next;}LinkQueueNode;typedefstruct{LinkQueueNode*fron
2、,获取每个ASCII码对应的位序列:intnNodeCount=GetHuffmanTree(nodes);构造哈夫曼树非常简单,将所有的节点放到一个队列中,用一个节点替换两个频率最低的节点,新节点的频率就是这两个节点的频率之和。这样,新节点就是两个被替换节点的父节点了。如此循环,直到队列中只剩一个节点(树根)。//parentnodepNode=&nodes[nParentNode++];//popfirstchildpNode->pLeft=PopNode(pNodes,nBackNode--,false);//popsecondchildpNode->pRight=PopNo
3、de(pNodes,nBackNode--,true);//adjustparentofthetwopopednodespNode->pLeft->pParent=pNode->pRight->pParent=pNode;//adjustparentfrequencypNode->nFrequency=pNode->pLeft->nFrequency+pNode->pRight->nFrequency;这里我用了一个好的诀窍来避免使用任何队列组件。我先前就直到ASCII码只有256个,但我分配了511个(CHuffmanNodenodes[511]),前255个记录ASCII码,而
4、用后255个记录哈夫曼树中的父节点。并且在构造树的时候只使用一个指针数组(ChuffmanNode*pNodes[256])来指向这些节点。同样使用两个变量来操作队列索引(intnParentNode=nNodeCount;nBackNode=nNodeCount–1)。接着,压缩的最后一步是将每个ASCII编码写入输出缓冲区中:intnDesIndex=0;//looptowritecodesfor(nCount=0;nCount>3))
5、=nodes[pSrc[nCount]].dw
6、Code<<(nDesIndex&7);nDesIndex+=nodes[pSrc[nCount]].nCodeLength;}(nDesIndex>>3):>>3以8位为界限右移后到达右边字节的前面(nDesIndex&7):&7得到最高位.注意:在压缩缓冲区中,我们必须保存哈夫曼树的节点以及位序列,这样我们才能在解压缩时重新构造哈夫曼树(只需保存ASCII值和对应的位序列)。解压缩解压缩比构造哈夫曼树要简单的多,将输入缓冲区中的每个编码用对应的ASCII码逐个替换就可以了。只要记住,这里的输入缓冲区是一个包含每个ASCII值的编码的位流。因此,为了用ASCII值替换编码,我们必
7、须用位流搜索哈夫曼树,直到发现一个叶节点,然后将它的ASCII值添加到输出缓冲区中:intnDesIndex=0;DWORDnCode;while(nDesIndex>3)))>>(nSrcIndex&7);pNode=pRoot;while(pNode->pLeft){pNode=(nCode&1)?pNode->pRight:pNode->pLeft;nCode>>=1;nSrcIndex++;}pDes[nDesIndex++]=pNode->byAscii;}过程#include8、o.h>#include#include#include#include#defineM10typedefstructFano_Node{charch;floatweight;}FanoNode[M];typedefstructnode{intstart;intend;structnode*next;}LinkQueueNode;typedefstruct{LinkQueueNode*fron
8、o.h>#include#include#include#include#defineM10typedefstructFano_Node{charch;floatweight;}FanoNode[M];typedefstructnode{intstart;intend;structnode*next;}LinkQueueNode;typedefstruct{LinkQueueNode*fron
此文档下载收益归作者所有