Huffman编码问题
#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;
}
}
麻烦大家帮忙看下代码,可以运行,但是当一输入字符串就发生错误,谁能耐心的看一下,感激涕零。。
...全文
相关推荐
多元Huffman编码问题(贪心算法)
题目:在一个操场的四周摆放着n堆石子。现要将石子有次序的合并成一堆。规定每次至少选2堆最多选k堆石子合并成新的一堆,合并的费用为新的一堆的石子数。试设计一个算法,计算出将n堆石子合并成一堆的最大费用和最小费用。 可以直接运行。
Huffman树编码问题
关于Huffman树的编码问题,适合基础薄弱的学生转载
多元Huffman编码问题[源码]
本文探讨了多元Huffman编码问题,特别是在石子合并场景中的应用。文章详细分析了如何计算将n堆石子合并成一堆的最大总费用和最小总费用。最大费用通过从大到小两两合并实现,而最小费用则需要尽可能以k堆为一组进行合并,并在必要时通过补零来满足合并条件。文中提供了具体的算法实现和代码示例,包括快速排序、二分查找插入等辅助函数,以及处理补零情况的逻辑。通过测试用例验证了算法的正确性,展示了如何在实际问题中应用Huffman编码原理。
图像处理中的压缩编码问题用Huffman
图像处理压缩编码是研究的一个热点目前有很多压缩方法,其中Huffman树压缩
南邮 OJ 1267 多元Huffman编码问题
多元Huffman编码问题 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte 总提交 : 93 测试通过 : 14 比赛描述 在一个操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次至少选2 堆最多选k堆石子合并成新的一堆,合并的费用为新的一堆的石子数。试设计一个算法,计


