Huffman编码问题
时间:2009-04-10
来源:互联网
#include<iostream.h>
#include<iomanip.h>
#include<string.h>
const MAX=1000;
int i,j;
class Node
{
public:
char data;
int weight;
int parent;
int lchild;
int rchild;
};
void Huffman (char ch[MAX],int weit[MAX],int NUM)
{
int TNUM,LTH;
TNUM=NUM*2-1;//整个哈夫曼树节点的个数
LTH=NUM-1;//编码的最大长度
Node nodes[MAX]; //用对象数组存储哈夫曼树
int one,two,a,b;
int hc[MAX][MAX]; //用于存储编码
int m,n;
//初始化数组
for(i=0;i<NUM;i++)
{
nodes[i].data=ch[i];
nodes[i].weight=weit[i];
nodes[i].parent=-1;
nodes[i].lchild=-1;
nodes[i].rchild=-1;
}
for(i=NUM;i<TNUM;i++)
{
nodes[i].data='@';
nodes[i].weight=-1;
nodes[i].parent=-1;
nodes[i].lchild=-1;
nodes[i].rchild=-1;
}
//建立哈夫曼树
for(i=NUM;i<TNUM;i++)
{
a=b=-1;
one=two=100000; //最大权数
for(j=0;j<i;j++)
{
if(nodes[j].parent==-1)
{
if(nodes[j].weight<=two)
{
one=two;
two=nodes[j].weight;
a=b;
b=j;
}
else if(nodes[j].weight>two&&nodes[j].weight<=one)
{
one=nodes[j].weight;
a=j;
}
}
}//for语句得到 parent=-1(即尚没有父结点)且weight最小的两个结点
nodes[a].parent=i;
nodes[b].parent=i;
nodes[i].lchild=a;
nodes[i].rchild=b;
nodes[i].weight=nodes[a].weight+nodes[b].weight;
}
//初始化hc
for(i=0;i<LTH;i++)
{
for(j=0;j<NUM;j++)
{
hc[j][i]=7;
}
}
//编码
for(i=0;i<NUM;i++)
{
j=LTH-1;
for(m=i,n=nodes[i].parent;m!=-1;m=n,n=nodes[n].parent)
{
if(nodes[n].lchild==m)
{
hc[i][j]=0;
}
else
{
hc[i][j]=1;
}
j--;
}
}
//输出编码
cout<<"Result:"<<endl;
cout<<setw(6)<<"char"<<setw(10)<<"frequency"<<setw(16)<<"huffmancode\n";
for(i=0;i<NUM;i++)
{
cout<<setw(6)<<ch[i]<<setw(8)<<weit[i];
cout<<" ";
for(j=0;j<LTH;j++)
{
if(hc[i][j]!=7)
{
cout<<hc[i][j];
}
}
cout<<endl;
}
cout<<"Done."<<endl;
}
/*********************************************************************/
void main()
{
char key='y';
char a[MAX];//用来存放输入的字符串
char ch[MAX];//用来存放所输入字符串中不重复的字符的数组
int weit[MAX];//用来存放对应于ch数组个每个字符权值的数组(ps:ch数组和weit数组是一一对应的关系)
int length;//计算输入字符串的长度
int NUM=0;//不同字母的个数
while(key=='y'||key=='Y')
{
cout<<"请输入您要进行Huffman编码的字符串:"<<endl;
cin>>a;
length=strlen(a);
//将输入的字符串进行处理,把完全不相同的字符放入ch数组中
bool x;
for(i=0;i<length;i++)
{
x=true;
for(int g=0;g<MAX;g++)
if(ch[g]==a[i])
{
x=false;
break;
}
if(x)
{
ch[NUM]=a[i];
NUM++;
}
}
//计算出ch数组中字符出现的频率(即权值)
for(i=0;i<NUM;i++)
{
int dota=0;
for(j=0;j<length;j++)
{
if(ch[i]==a[j])
dota++;
}
weit[i]=dota;
}
Huffman(ch,weit,NUM);
cout<<"是否继续进行Huffman编码 Y(继续)or N(退出)"<<endl;
cin>>key;
}
}
麻烦大家帮忙看下代码,可以运行,但是当一输入字符串就发生错误,谁能耐心的看一下,感激涕零。。
#include<iomanip.h>
#include<string.h>
const MAX=1000;
int i,j;
class Node
{
public:
char data;
int weight;
int parent;
int lchild;
int rchild;
};
void Huffman (char ch[MAX],int weit[MAX],int NUM)
{
int TNUM,LTH;
TNUM=NUM*2-1;//整个哈夫曼树节点的个数
LTH=NUM-1;//编码的最大长度
Node nodes[MAX]; //用对象数组存储哈夫曼树
int one,two,a,b;
int hc[MAX][MAX]; //用于存储编码
int m,n;
//初始化数组
for(i=0;i<NUM;i++)
{
nodes[i].data=ch[i];
nodes[i].weight=weit[i];
nodes[i].parent=-1;
nodes[i].lchild=-1;
nodes[i].rchild=-1;
}
for(i=NUM;i<TNUM;i++)
{
nodes[i].data='@';
nodes[i].weight=-1;
nodes[i].parent=-1;
nodes[i].lchild=-1;
nodes[i].rchild=-1;
}
//建立哈夫曼树
for(i=NUM;i<TNUM;i++)
{
a=b=-1;
one=two=100000; //最大权数
for(j=0;j<i;j++)
{
if(nodes[j].parent==-1)
{
if(nodes[j].weight<=two)
{
one=two;
two=nodes[j].weight;
a=b;
b=j;
}
else if(nodes[j].weight>two&&nodes[j].weight<=one)
{
one=nodes[j].weight;
a=j;
}
}
}//for语句得到 parent=-1(即尚没有父结点)且weight最小的两个结点
nodes[a].parent=i;
nodes[b].parent=i;
nodes[i].lchild=a;
nodes[i].rchild=b;
nodes[i].weight=nodes[a].weight+nodes[b].weight;
}
//初始化hc
for(i=0;i<LTH;i++)
{
for(j=0;j<NUM;j++)
{
hc[j][i]=7;
}
}
//编码
for(i=0;i<NUM;i++)
{
j=LTH-1;
for(m=i,n=nodes[i].parent;m!=-1;m=n,n=nodes[n].parent)
{
if(nodes[n].lchild==m)
{
hc[i][j]=0;
}
else
{
hc[i][j]=1;
}
j--;
}
}
//输出编码
cout<<"Result:"<<endl;
cout<<setw(6)<<"char"<<setw(10)<<"frequency"<<setw(16)<<"huffmancode\n";
for(i=0;i<NUM;i++)
{
cout<<setw(6)<<ch[i]<<setw(8)<<weit[i];
cout<<" ";
for(j=0;j<LTH;j++)
{
if(hc[i][j]!=7)
{
cout<<hc[i][j];
}
}
cout<<endl;
}
cout<<"Done."<<endl;
}
/*********************************************************************/
void main()
{
char key='y';
char a[MAX];//用来存放输入的字符串
char ch[MAX];//用来存放所输入字符串中不重复的字符的数组
int weit[MAX];//用来存放对应于ch数组个每个字符权值的数组(ps:ch数组和weit数组是一一对应的关系)
int length;//计算输入字符串的长度
int NUM=0;//不同字母的个数
while(key=='y'||key=='Y')
{
cout<<"请输入您要进行Huffman编码的字符串:"<<endl;
cin>>a;
length=strlen(a);
//将输入的字符串进行处理,把完全不相同的字符放入ch数组中
bool x;
for(i=0;i<length;i++)
{
x=true;
for(int g=0;g<MAX;g++)
if(ch[g]==a[i])
{
x=false;
break;
}
if(x)
{
ch[NUM]=a[i];
NUM++;
}
}
//计算出ch数组中字符出现的频率(即权值)
for(i=0;i<NUM;i++)
{
int dota=0;
for(j=0;j<length;j++)
{
if(ch[i]==a[j])
dota++;
}
weit[i]=dota;
}
Huffman(ch,weit,NUM);
cout<<"是否继续进行Huffman编码 Y(继续)or N(退出)"<<endl;
cin>>key;
}
}
麻烦大家帮忙看下代码,可以运行,但是当一输入字符串就发生错误,谁能耐心的看一下,感激涕零。。
作者: fantasyfans 发布时间: 2009-04-10
怎么都没人回答呢?我也想知道问题在哪
作者: seashell126 发布时间: 2011-12-19
在我的编译器上报的是"stack Overflow"错误,是字符数组开大了,将const MAX常量改小一点(譬如100)就可以了,至于为什么数组会开大,这应该是局部变量所导致的。以下是百度到的看法:
在main函数里边定义OS要为他分配堆栈空间,
而用全局变量的话用的是堆空间,
而且堆栈空间比较小,
堆空间可以利用整个内存的空余部分
不单单是字符串数组,
定义一些大数组时也应该这样
在main函数里边定义OS要为他分配堆栈空间,
而用全局变量的话用的是堆空间,
而且堆栈空间比较小,
堆空间可以利用整个内存的空余部分
不单单是字符串数组,
定义一些大数组时也应该这样
作者: huanzhile 发布时间: 2011-12-24
还有LZ应该多结贴,这样才有人来光顾。我想有很多人是被你的结贴率·······
作者: huanzhile 发布时间: 2011-12-24
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28