• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: C/C++
  • 标签: 哈夫曼  

资源简介

网上很多哈夫曼源代码要不是复制,要不是对文件操作,无法对内存缓冲区使用。自己写了一个c++类封装的,接口简洁,方便使用,提供对缓冲区内存的编码和解码,测试可行。但编码和解码时间较长,以后改进。

资源截图

代码片段和文件信息

#include “HuffMan.h“

string CHufffMan::HuffDeCode(const char *bufferunsigned int ilenint ipos)
{
memcpy(m_cFreqbufferCHAR_NUM*sizeof(unsigned int));
CreateQueue();
CreateHuffManTree();

return DeCode(buffer+=CHAR_NUM*sizeof(unsigned int)ilen-CHAR_NUM*sizeof(unsigned int)ipos);
}

void CHufffMan::StatisCharFreq(const char *bufferunsigned int ilen)
{
memset(m_cFreq0CHAR_NUM*sizeof(unsigned int));
for (unsigned int i=0;i {
m_cFreq[(unsigned char)buffer[i]]++;
}
}

void CHufffMan::CreateQueue()
{
m_FreqQue.clear();
for (int i=0;i {
if (m_cFreq[i])
{
m_FreqQue.insert(make_pair(im_cFreq[i]));
}
}
}

void CHufffMan::CreateHuffManTree()
{
int iNode=m_FreqQue.size();
//初始化哈夫曼树共有2n-1个节点
delete[] m_HuffTree;
m_HuffTree=new HuffNode[iNode*2-1];
m_vValueKey.clear();
//初始化叶子节点
map::iterator iter=m_FreqQue.begin();
for (int i=0;iter!=m_FreqQue.end();++i++iter)
{
m_HuffTree[i].weight=iter->second;
m_HuffTree[i].value=iter->first;
m_HuffTree[i].code=0;
m_vValueKey[iter->first]=i;
}

    //构造哈夫曼树haffTree的n-1个非叶结点 
    for(int i=0;i
int m1=100000m2=100000;     //Maxvalue=10000;(就是一个相当大的数) 
int x1=0x2=0;     //x1、x2是用来保存最小的两个值在数组对应的下标   

//循环找出所有权重中,最小的二个值
for(int j=0;j
if(m_HuffTree[j].weight
m2=m1; 
x2=x1; 
m1=m_HuffTree[j].weight; 
x1=j; 

else if(m_HuffTree[j].weight
m2=m_HuffTree[j].weight; 
x2=j; 

}
//将找出的两棵权值最小的子树合并为一棵子树 
m_HuffTree[x1].bflag=true; 
m_HuffTree[x2].bflag=true; 
m_HuffTree[x1].code=0;
m_HuffTree[x2].code=1;
m_HuffTree[iNode+i].weight=m_HuffTree[x1].weight+m_HuffTree[x2].weight; 
m_HuffTree[iNode+i].lchild=x1; 
m_HuffTree[iNode+i].rchild=x2; 
m_HuffTree[x1].parent=iNode+i;
m_HuffTree[x2].parent=iNode+i;

}

string CHufffMan::Code(const char* bufferunsigned int ilenint &iout)
{
string strContent=GetHuffTree();
string str;
for (unsigned int i=0;i {
map::iterator iter=m_vValueKey.find(buffer[i]);
if (iter!=m_vValueKey.end())
{
str+=GetCodeStr(iter->second);
while (str.size()>7)
{
bitset<8> bit(str.substr(08));
strContent+=static_cast(bit.to_ulong());;
str.erase(08);
}
}
}
iout=0;

if (!str.empty())
{
iout=8-str.size();
str.insert(str.size()iout‘0‘);
bitset<8> bit(str);
strContent+=static_cast(bit.to_ulong());
}

return strContent;
}

string CHufffMan::GetCodeStr(int iNode)
{
string str=ToString(m_HuffTree[iNode].code);
while (m_HuffTree[iNode].parent!=-1)
{
iNode=m_HuffTree[iNode].parent;
if (m_HuffTree[iNode].code!=-1)
{
   str+=ToString(m_HuffTree[iNode].code);
}
}
reverse(str.begin()str.end());

return str;
}

string CHufffMan::GetHuffTree()

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4298  2014-10-23 14:24  HuffMan.cpp

     文件       2216  2014-10-23 13:42  HuffMan.h

----------- ---------  ---------- -----  ----

                 6514                    2


评论

共有 条评论