资源简介
网上很多哈夫曼源代码要不是复制,要不是对文件操作,无法对内存缓冲区使用。自己写了一个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
相关资源
- C++哈夫曼编码与译码课程设计实现源
- 数据结构 哈夫曼树C语言源代码
- 哈夫曼树的建立(Huffman Tree C语言实现
- C++实现哈夫曼树及哈夫曼编码.rar
- n元哈夫曼编码
- 基于哈夫曼编码的文本文件压缩与解
- c++实现哈夫曼树的编译码
- 赫夫曼树哈夫曼树 算法 编码 源代
- 基于C++和MFC的哈夫曼编码压缩软件的
- 哈夫曼压缩解压算法-C语言
- 数据结构实验-哈夫曼编码C语言实现实
- 北邮信通院数据结构实验_哈夫曼树
- 哈夫曼编码 (C++实现)
- 哈夫曼树C语言编程实现
- 哈夫曼编码(c++实现)
- 哈夫曼编/译码器(beta3.c)
- c++ 压缩文件、解压缩文件哈夫曼算法
- 香农编码 哈夫曼编码 信息论期中作业
- 哈夫曼树的编码与译码包含文件输入
- 哈夫曼编码器c代码
- c语言哈夫曼树
- MFC下的哈夫曼编码及应用
- C语言编码哈夫曼树
- 哈夫曼树完整课程设计C++包过没优秀
- 数据结构课程设计-哈夫曼编译器.ra
- Huffman文件压缩解压缩-C语言-数据结构
- 哈夫曼树的创建、编码、译码
- 信息论与编码实验C++(香农 费诺 哈夫
- 哈夫曼编码(C语言版)
- 哈夫曼编码C语言的实现
评论
共有 条评论