哈夫曼编码和译码系统Word文件下载.docx
- 文档编号:15985397
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:13
- 大小:143.49KB
哈夫曼编码和译码系统Word文件下载.docx
《哈夫曼编码和译码系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码和译码系统Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
四、详细设计.........................................4
1.用类来定义变量和函数................................4
2.构造哈夫曼树.........................................5
3.根据哈夫曼树进行哈夫曼编码..........................6
4.输出对应的哈夫曼编码表..............................7
5.对输入的字符进行编码................................8
6.对输入的编码进行译码................................9
7.主函数..............................................10
五、调试分析........................................13
六、实验总结........................................16
一、前言
在这个信息高速发展的时代,每时每刻都进行着大量的信息传递,到处都离不开信息,它贯穿在人们日常的生活之中,对人们产生的影响日趋扩大,而利用哈夫曼码进行通信则可以大大提高信道利用率,缩短通信传输时间,降低传输成本。
在生产中则可以更大可能的降低成本从而获得更大里润,这也是信息时代发展的趋势所在。
本次实训设计的是哈夫曼编码和译码系统,建立一个简易的系统,对于给定的一篇英文文章,统计字符出现的概率,并根据概率建立Huffman树,利用Huffman编码对文章进行编码和译码。
掌握Huffman树的建立及应用,并进一步熟练掌握程序的设计流程。
这是个拥有完整功能的系统程序,对将所学到的知识运用到实践中,在设计的同时,培养了学生各方面的能力。
二、需求分析
1.问题描述
在传送电文时,人们总是希望传送时间尽可能短,这就是要求使电文代码长度尽可能短。
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统能够对待传输数据预先编码,在接收端将传来的数据进行译码,所以为这样的信息收发站写一个哈夫曼的编译码系统。
2.基本要求
输入一段英文原文,构造哈夫曼树,生成对应的编码表,输出原文对应的编码,或者是根据已生成的编码表,输入一段二进制数编码,得到对应的字符原文。
3.根据需求,该系统应具备以下功能
对给出的字符以及字符的权值构造哈夫曼树,生成对应的编码表
输入一段原文,对原文进行编码
输入二进制编码,输出对应的原文
三、概要设计
1.哈夫曼编码和译码的方法概述
初始化,每个字符就是一个结点,对应节点的权值大小,选取权值最小的两个结点,以它们为儿子,构造出一个新的结点;
新结点的权值就是它两个儿子的权值之和;
构造之后,从原来的结点序列里删除刚才选出的那两个结点,但同时将新生成的结点加进去;
如果结点序列里只剩下一个结点,表示构造完毕,退出。
否则回到第一步。
对某个结点而言,其左孩子在当前阶段的编码为0,右孩子的编码为1,这样就可以通过遍历树来生成字符一一对应的编码表
来到这里,基本上艰苦的已经完成了,对某个具体的字符串编码和解码就只是简单的“查表——替换”的工作了。
译码:
译码也是个简单的查表--替换过程。
如果利用该种编码发送字符串,则它的“字符——编码”对应表也必须发送过去,然后
对给出的一串编码,从左向右,将编码组合起来并查表,一旦找到有匹配的字符,则将当前的编码替换为对应的字符。
因为该编码是不会出现”某一个字符的编码是另一个字符编码的缀”这种情况的,也就是不会出现类似于“A为00而B为0010”
这样的情况,所以译码出来的字符串是唯一的,而且就是原来进行编码的那一个。
2.流程图
四、详细设计
1.用类来定义变量和函数
classNode//节点类
{
public:
friendHafuman;
chardata;
//结点值
intweight;
//权值
intparent;
//双亲结点
intlchild;
//左孩子结点
intrchild;
//右孩子结点
voidCreateHT(Nodeht[],intn);
voidCreateHCode(Nodeht[],Hafumanhcd[],intn);
};
classHafuman
friendNode;
charcd[N];
//存放哈夫曼码
intstart;
//从start开始读cd中的哈夫曼码
voidDispHCode(Nodeht[],Hafumanhcd[],intn);
voideditHCode(Nodeht[],Hafumanhcd[],intn);
voiddeHCode(Nodeht[],Hafumanhcd[],intn);
2.构造哈夫曼树
voidNode:
:
CreateHT(Nodeht[],intn){
inti,k,lnode,rnode;
intmin1,min2;
for(i=0;
i<
2*n-1;
i++)
ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
//所有结点的相关域置初值-1
for(i=n;
i++)//构造哈夫曼树
min1=min2=32767;
//int的范围是-32768—32767
lnode=rnode=-1;
//记录最小权值的两个结点位置
for(k=0;
k<
=i-1;
k++)
{
if(ht[k].parent==-1)//只在尚未构造二叉树的结点中查找
if(ht[k].weight<
min1)//若权值小于最小的左节点的权值
min2=min1;
rnode=lnode;
min1=ht[k].weight;
lnode=k;
}
elseif(ht[k].weight<
min2)
min2=ht[k].weight;
rnode=k;
}
ht[lnode].parent=i;
ht[rnode].parent=i;
//两个最小节点的父节点是i
ht[i].weight=ht[lnode].weight+ht[rnode].weight;
//两个最小节点的父节点权值为两个最小节点权值之和
ht[i].lchild=lnode;
ht[i].rchild=rnode;
//父节点的左节点和右节点
3.根据哈夫曼树进行哈夫曼编码
CreateHCode(Nodeht[],Hafumanhcd[],intn)
inti,f,c;
Hafumanhc;
n;
i++)//根据哈夫曼树求哈夫曼编码
hc.start=n;
c=i;
f=ht[i].parent;
while(f!
=-1)//循序直到树根结点结束循环
if(ht[f].lchild==c)//处理左孩子结点
hc.cd[hc.start--]='
0'
;
else//处理右孩子结点
1'
c=f;
f=ht[f].parent;
hc.start++;
//start指向哈夫曼编码hc.cd[]中最开始字符
hcd[i]=hc;
4.输出对应的哈夫曼编码表
voidHafuman:
DispHCode(Nodeht[],Hafumanhcd[],intn)
inti,k;
cout<
<
"
输出哈夫曼编码:
\n"
i++)//输出data中的所有数据,即A-Z
{cout<
"
\t"
ht[i].data<
for(k=hcd[i].start;
k<
=n;
k++)//输出所有data中数据的编码
hcd[i].cd[k];
cout<
5.对输入的字符进行编码
editHCode(Nodeht[],Hafumanhcd[],intn){
charstring[MAXSIZE];
inti,j,k;
cin>
>
string;
//把要进行编码的字符串存入string数组中
cout<
\n输出编码结果:
string[i]!
='
#'
i++)//#为终止标志
for(j=0;
j<
j++)
if(string[i]==ht[j].data||string[i]==ht[j].data+32)//循环查找及输入字符相同的编号,相同的就输出这个字符的编码
for(k=hcd[j].start;
=n;
hcd[j].cd[k];
break;
//输出完成后跳出当前for循环
}
6.对输入的编码进行译码
deHCode(Nodeht[],Hafumanhcd[],intn)//译码函数
charcode[MAXSIZE];
inti,j,k,m,x,Knum=50;
code;
//把要进行译码的字符串存入code数组中
while(code[0]!
)
m=0;
//m为想同编码个数的计数器
for(k=hcd[i].start,j=0;
k++,j++)//j为记录所存储这个字符的编码个数
if(code[j]==hcd[i].c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼 编码 译码 系统