实验七Huffman编码的设计与应用.docx
《实验七Huffman编码的设计与应用.docx》由会员分享,可在线阅读,更多相关《实验七Huffman编码的设计与应用.docx(10页珍藏版)》请在冰豆网上搜索。
实验七Huffman编码的设计与应用
深圳大学实验报告
课程名称:
数据结构实验与课程设计
实验项目名称:
Huffman编码的设计与应用
学院:
数学与计算科学学院
专业:
数计班
指导教师:
张艳
报告人:
张宏宽学号:
2013190067班级:
数计班
实验时间:
2014/11/7
实验报告提交时间:
2014/11/10
教务部制
实验目的与要求:
实验目的:
1、1、问题描述
给定n个字符及其对应的权值,构造Huffman树,并进行huffman编码和译(解)码。
构造Huffman树时,要求左子树根的权值小于右子树根的权值。
进行Huffman编码时,假定Huffman树的左分支上编码为‘0’,右分支上编码为‘1’。
2、算法
构造Huffman树算法:
⑴、根据给定的n个权值(w1,w2,…,wn)构成n棵二叉树的集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个权值为wi的根结点
⑵、在F中选取两棵根结点的权值最小的树,作为左、右子树构造一棵新的二叉树,且置其根结点的权值为其左、右子树权值之和
⑶、在F中删除这两棵树,同时将新得到的二叉树加入F中
⑷、重复⑵,⑶,直到F只含一棵树为止
Huffman编码算法:
⑴、从Huffman树的每一个叶子结点开始
⑵、依次沿结点到根的路径,判断该结点是父亲结点的左孩子还是右孩子,如果是左孩子则得到编码‘0’,否则得到编码‘1’,先得到的编码放在后面
⑶、直到到达根结点,编码序列即为该叶子结点对应的Huffman编码
Huffman译(解)码算法:
⑴、指针指向Huffman树的根结点,取第一个Huffman码
⑵、如果Huffman码为‘0’,将指针指向当前结点的左子树的根结点;如果Huffman码为‘1’,将指针指向当前结点的右子树的根结点
⑶、如果指针指向的当前结点为叶子结点,则输出叶子结点对应的字符;否则,取下一个Huffman码,并返回⑵
⑷、如果Huffman码序列未结束,则返回⑴继续译码
实验要求:
1、使用Huffman编码算法实现题目的要求。
实验内容:
Input
第一行:
样本字符个数,假设为n。
第二行,n个字符(用空格隔开)
第三行,n个字符对应的权值(用空格隔开)
第四行,待编码的字符串
第五行,待译码的Huffman码序列
Output
第一行,每个字符对应的Huffman编码(用空格隔开)
第二行,字符串对应的Huffman编码序列
第三行,Huffman码序列对应的字符串
SampleInput
4
abcd
9326
abcd
111001010
SampleOutput
010110011
010110011
dcba
实验过程:
1、实现思想(用文字描述用栈和队列判断回文的思想)
构造Huffman树算法:
⑴、根据给定的n个权值(w1,w2,…,wn)构成n棵二叉树的集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个权值为wi的根结点
⑵、在F中选取两棵根结点的权值最小的树,作为左、右子树构造一棵新的二叉树,且置其根结点的权值为其左、右子树权值之和
⑶、在F中删除这两棵树,同时将新得到的二叉树加入F中
⑷、重复⑵,⑶,直到F只含一棵树为止
Huffman编码算法:
⑴、从Huffman树的每一个叶子结点开始
⑵、依次沿结点到根的路径,判断该结点是父亲结点的左孩子还是右孩子,如果是左孩子则得到编码‘0’,否则得到编码‘1’,先得到的编码放在后面
⑶、直到到达根结点,编码序列即为该叶子结点对应的Huffman编码
2、实现代码(核心语句加注释)
#include
#include
usingnamespacestd;
#defineerror-1
#definecorrect1
#definemaxLen15
#definemaxChar10
#definemaxStr100
typedefstruct{
charc;
intweight;
intparent,lchild,rchild;
charcode[maxLen];
}HTNode,*HuffmanTree;
HTNodeHT[2*maxChar];
voidSelect(inti1,int*s1,int*s2)
{
unsignedintj,s;
s=0;
for(j=1;j<=i1;j++){
if(HT[j].parent==0){
if(s==0)s=j;
if(HT[j].weight}
}
*s1=s;
s=0;
for(j=1;j<=i1;j++){
if((HT[j].parent==0)&&(j!
=*s1)){
if(s==0)s=j;
if(HT[j].weight}
}
*s2=s;
}
voidCreat(intn,char*c,int*w)
{
inti,m,s1,s2;
m=2*n-1;
for(i=1;i<=n;++i){
HT[i].c=c[i-1];
HT[i].weight=w[i-1];
HT[i].parent=0;
HT[i].lchild=HT[i].rchild=0;}
for(i=n+1;iHT[i].weight=0;
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=n+1;i<=m;++i){
Select(i-1,&s1,&s2);
HT[s1].parent=i;HT[s2].parent=i;
HT[i].lchild=s1;HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
}
voidCode(intn)
{
inti,j,m,c,f,start;
charcd[maxLen];
m=maxLen;
cd[m-1]=0;
for(i=1;i<=n;i++){
start=m-1;
for(c=i,f=HT[i].parent;f!
=0;c=f,f=HT[f].parent){
if(HT[f].lchild==c)cd[--start]='0';
elsecd[--start]='1';
}
for(j=0;jHT[i].code[j]=0;
}
}
voidShowCode(intn)
{
inti;
for(i=1;icout<}
intShowEncode(intn,char*eS)
{
inti,j;
for(j=0;jfor(i=1;i<=n;i++){
if(eS[j]==HT[i].c){
cout<break;
}
}
if(i>n)return(error);
}
cout<return(correct);
}
intShowDecode(intn,char*dS)
{
inti,c;
intRoot;
Root=2*n-1;
c=Root;
for(i=0;iif((HT[c].lchild==0)&&(HT[c].rchild==0)){
cout<c=Root;
}
if(dS[i]=='0'){
if(HT[c].lchild==0)return(error);
c=HT[c].lchild;
}
else{
if(HT[c].rchild==0)return(error);
c=HT[c].rchild;
}
}
cout<return(correct);
}
intmain()
{
inti,n;
intweight[maxChar];
charc[maxChar],encode[maxLen],decode[maxLen];
cin>>n;
for(i=0;i>c[i];
for(i=0;i>weight[i];
Creat(n,c,weight);
Code(n);
ShowCode(n);
cin>>encode;
ShowEncode(n,encode);
cin>>decode;
ShowDecode(n,decode);
return0;
}
实验结果及分析:
1、测试数据(除给出的测试样例外,自己构造至少2组测试数据,注意考虑非法输入情况)
2、测试结果(给出每组测试数据的运行截图)
3、实验结果分析
深圳大学学生实验报告用纸
实验总结:
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。