实验七Huffman编码的设计与应用.docx
- 文档编号:28651507
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:10
- 大小:60.88KB
实验七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;i HT[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;j HT[i].code[j]=0; } } voidShowCode(intn) { inti; for(i=1;i cout< } intShowEncode(intn,char*eS) { inti,j; for(j=0;j for(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;i if((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 for(i=0;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日内。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验七 Huffman编码的设计与应用 实验 Huffman 编码 设计 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)