+ -
当前位置:首页 → 问答吧 → Huffman编码问题

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; 



麻烦大家帮忙看下代码,可以运行,但是当一输入字符串就发生错误,谁能耐心的看一下,感激涕零。。

作者: fantasyfans   发布时间: 2009-04-10

怎么都没人回答呢?我也想知道问题在哪

作者: seashell126   发布时间: 2011-12-19

在我的编译器上报的是"stack Overflow"错误,是字符数组开大了,将const MAX常量改小一点(譬如100)就可以了,至于为什么数组会开大,这应该是局部变量所导致的。以下是百度到的看法:
在main函数里边定义OS要为他分配堆栈空间,
而用全局变量的话用的是堆空间,
而且堆栈空间比较小,
堆空间可以利用整个内存的空余部分
不单单是字符串数组,
定义一些大数组时也应该这样

作者: huanzhile   发布时间: 2011-12-24

还有LZ应该多结贴,这样才有人来光顾。我想有很多人是被你的结贴率·······

作者: huanzhile   发布时间: 2011-12-24