仪器社区

26个字母的HUFFMAN建立和编码器的实现

就是全部带走 2006-05-19
字符:# A B C D E F G H I J K L M N O P K R S T U V W X Y Z 频度:186 64 13 22 32 103 21 15 47 57 1 5 32 20 57 63 15 1 48 51 20 23 8 18 1 16 1 上机实验说明:设字符集为26个英文字母,其出现频度如上所示。 要求:先建Huffman树,再利用... 字符:# A B C D E F G H I J K L M N O P K R S T U V W X Y Z 频度:186 64 13 22 32 103 21 15 47 57 1 5 32 20 57 63 15 1 48 51 20 23 8 18 1 16 1 上机实验说明:设字符集为26个英文字母,其出现频度如上所示。 要求:先建Huffman树,再利用此树对任一字符串文件进行编码和译码——即设计一个Huffman编/译码器.再将其打印出来 我急于交作业,请大虾们帮帮忙
评论
全部评论
aaa1079588259
//你稍加修改频度数据即可
//本程序根据26个英文字母出现的频度,得到了它们的一种哈夫曼编码方案
//by jirgal 2005.4.18
#include
#include
#define NUM 26 //字母数
#define TNUM 51 //
#define LTH 15 //编码Z大长度

class Node
{
public:
char data;
int weight;
int parent;
int lchild;
int rchild;
};

void main()
{
char ch[NUM]={'a','b','c','d','e','f','g','h','i','j','k','l',
'm','n','o','p','q','r','s','t','u','v','w','x','y','z'};//26个字母

int weit[NUM]={856,139,279,378,1304,289,199,528,627,13,42,
339,249,707,797,199,12,677,607,1045,249,92,149,17,199,8};//出现频率

Node nodes[TNUM]; //用对象数组存储哈夫曼树

int i,j,one,two,a,b;
int hc[NUM][LTH]; //用于存储编码
int m,n;

//初始化数组
for(i=0;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 {
nodes[i].data='@';
nodes[i].weight=-1;
nodes[i].parent=-1;
nodes[i].lchild=-1;
nodes[i].rchild=-1;
}

//建立哈夫曼树
for(i=NUM;i {
a=b=-1;
one=two=10000; //Z大权数
for(j=0;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(即尚没有父结点)且weightZ小的两个结点
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 {
for(j=0;j {
hc[j][i]=7;
}
}

//编码
for(i=0;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--;
}

}

//输出 nodes
cout<<"HuffmanTree:"< cout< <<"parnt"< for(i=0;i {
cout< < }

//输出编码
cout< cout< for(i=0;i {
cout< cout<<" ";
for(j=0;j {
if(hc[i][j]!=7)
{
cout< }
}
cout< }
cout<<"\nDone.\n"< }
3 0 2006-05-20 0条评论 回复
您可能感兴趣的社区主题
加载中...
发布 评论