LZW编码与译码.docx
- 文档编号:25512357
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:10
- 大小:73.16KB
LZW编码与译码.docx
《LZW编码与译码.docx》由会员分享,可在线阅读,更多相关《LZW编码与译码.docx(10页珍藏版)》请在冰豆网上搜索。
LZW编码与译码
重庆交通大学信息科学与工程学院
综合性设计性实验报告
专业:
通信工程专业11级
学号:
************
******
实验所属课程:
信息论与编码
实验室(中心):
信息技术软件实验室
********
2014年5月
教师评阅意见:
签名:
年月日
实验成绩:
一、题目
LZW编码与译码
二、编程要求
要求一:
对字符串进行LZW编码,输出与字符串相一一对应的码字,本次实验所选的字符串为“ABBABABAC”。
要求二:
对要求一输出结果的码字进行译码输出
三、仿真方案详细设计
LZW(Lempel-Ziv&Welch)编码又称为字串表编码,属于一种无损压缩编码。
LZW编码与游程编码类似,也是对字符串进行编码从而实现压缩,但它在编码的同时还生成了特定字符串以及与之对应的索引字符串表。
LZW压缩使用字典库查找方案。
它读入待压缩的数据并与一个字典库(库开始是空的)中的字符串进行对比,如有匹配的字符串,则输出该字符串数据在字典库中的位置索引,否则将该字符串插入字典中。
LZW编码算法
①将字典初始化为包含所有可能的单字字符,当前前缀P初始化为空;
②读入当前字符到C(即字符流中的下一个字符);
③判断P+C是否在字典中,如果在字典中,则用C扩展P,即P=P+C;否则输出与当前前缀P相对应的码字,同时将P+C添加到字典中并令P=C,即重新置当前前缀;
④判断字符流结束与否,如果没有结束,转②,否则把代表当前前缀P的码字输出到码字流;
⑤结束。
编码流程图如下
LZW译码算法
①初始化字典,并读入一个码字W;
②试读一个码字K,如果不存在码字K可读,则输出W对应的字符串,转③;否则,在W对应的字符(串)末尾加入码字K的第一个字符,形成的字符串加入字典(如果K还未在字典中出现,则W+FirstChar(W)放入字典)。
然后输出W对应的字符(串),同时W=K(重新赋W的值);转②;
③算法结束。
译码流程图如下
四、仿真结果及结论
结果所示:
结论:
本次实验成功的完成了LZW编码的编码过程和译码过程,同时对字符串进行编码从而实现压缩,但它在编码的同时还生成了特定字符串以及与之对应的索引字符串表即词典。
从试验结果看出我们对字符串进行编码首要就是进行词典构造。
五、总结与体会
总结:
这次实验完成了LZW的编码与译码,同时也让我对它的算法有了一个深刻的理解与掌握。
在编程过程中需要对C++语言有较好的掌握,里面涉及到了类和指针的用法。
这个实验会考察你对算法的理解与掌握能力,最重要的还有分析能力与C++编程基本功。
心得体会:
通过本次实验,我掌握了LZW的编码与译码算法,对它的核心思想有了较好的掌握。
它是无失真信源编码的一种重要方法,刚开始的时候编程对这个算法还不太熟练,我通过请教老师和网上查找资料对着个算法编程有了一定的想法。
随后,我反复编写与思考,最终得以实现结果。
本次实验运行环境是在VisualC++6.0,里面涉及了C与C++的语言。
通过这次实验不仅加强了我的编程能力,也提高了我的分析问题的能力,虽然作业量不是很大,但是我通过实验又重新对编程语言有了一个很好的回顾。
希望以后能多做类似的实验,我觉得可以很好的把以前所学很好的结合起来。
同时也感谢老师每次对我的细致耐心的讲解,让我对理论知识有了很好的巩固。
六、主要仿真代码
#include
#include
usingnamespacestd;
constintN=200;
classLZW
{
private:
stringDic[200];
intcode[N];
public:
LZW(){
Dic[0]='A';
Dic[1]='B';
Dic[2]='C';
}
voidencode(stringcs[N]);
voiddecode(intcs[N],intlength1);
intIsDic(stringe);
intcodeDic(stringf);
voiddisplay(intg);
};
voidLZW:
:
encode(stringcs[N]){
stringP,C,K;
P=cs[0];
intl=0;
for(inti=1;i C=cs[i]; K=P+C; if(IsDic(K)) P=K; else{ code[l]=codeDic(P); Dic[3+l]=K; P=C; l++; } if(N-1==i) code[l]=codeDic(P); } display(l); } intLZW: : IsDic(stringe){ for(intb=0;b { if(e==Dic[b])return1; } return0; } intLZW: : codeDic(stringf) { intw=0; for(inty=0;y if(f==Dic[y]){ w=y+1; break; } returnw; } voidLZW: : display(intg){ cout<<"经过LZW编码后的码字如下: "< for(inti=0;i<=g;i++) cout< cout< cout<<"经LZW编码后的词典如下: "< for(intr=0;r cout< } voidLZW: : decode(intcs[N],intlength1){ intw,k; w=cs[0]; intI=0; stringp1,p2; for(inti=1;i { k=cs[i]; p1=Dic[w-1]; if(Dic[k-1]! ="\0") {p2=Dic[k-1];} else {p2=p1;} Dic[I+3]=p1+p2[0]; I++; cout< w=k; } if(i==length1)cout< cout<<"经LZW译码后的词典如下: "< for(intr=0;r cout< } intmain(){ LZWt; stringCSstream[N]; intb[N]; intlength,length1; cout<<"madeby徐国健"< cout<<"请输入所求码子序列的长度: "; cin>>length; while(length>=N) { cout<<"该长度太长,请重新输入: "; cin>>length; } cout<<"请输入要进行LZW编码的字符序列: "< for(inta=0;a cin>>CSstream[a]; t.encode(CSstream); cout<<"输入译码序列长度"< cin>>length1; cout<<"输入译码序列"< for(inti=0;i { cin>>b[i]; } t.decode(b,length1); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LZW 编码 译码
![提示](https://static.bdocx.com/images/bang_tan.gif)