您好,欢迎访问三七文档
重庆交通大学信息科学与工程学院综合性设计性实验报告专业:通信工程专业11级学号:631106040222姓名:徐国健实验所属课程:信息论与编码实验室(中心):信息技术软件实验室指导教师:李益才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的值);转②;③算法结束。译码流程图如下四、仿真结果及结论结果所示:初始化字典读入一个码字W试读一个码字K取出码字W对应的字符串P1K是结束符输出W对应的字符串结束YN取出码字K对应的字符串P2将P1+FirstChar(P2)存入字典输出码字W对应的字符串W=KK不在字典中NP2=P1结论:本次实验成功的完成了LZW编码的编码过程和译码过程,同时对字符串进行编码从而实现压缩,但它在编码的同时还生成了特定字符串以及与之对应的索引字符串表即词典。从试验结果看出我们对字符串进行编码首要就是进行词典构造。五、总结与体会总结:这次实验完成了LZW的编码与译码,同时也让我对它的算法有了一个深刻的理解与掌握。在编程过程中需要对C++语言有较好的掌握,里面涉及到了类和指针的用法。这个实验会考察你对算法的理解与掌握能力,最重要的还有分析能力与C++编程基本功。心得体会:通过本次实验,我掌握了LZW的编码与译码算法,对它的核心思想有了较好的掌握。它是无失真信源编码的一种重要方法,刚开始的时候编程对这个算法还不太熟练,我通过请教老师和网上查找资料对着个算法编程有了一定的想法。随后,我反复编写与思考,最终得以实现结果。本次实验运行环境是在VisualC++6.0,里面涉及了C与C++的语言。通过这次实验不仅加强了我的编程能力,也提高了我的分析问题的能力,虽然作业量不是很大,但是我通过实验又重新对编程语言有了一个很好的回顾。希望以后能多做类似的实验,我觉得可以很好的把以前所学很好的结合起来。同时也感谢老师每次对我的细致耐心的讲解,让我对理论知识有了很好的巩固。六、主要仿真代码#includeiostream#includestringusingnamespacestd;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;iN;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;bN;b++){if(e==Dic[b])return1;}return0;}intLZW::codeDic(stringf){intw=0;for(inty=0;yN;y++)if(f==Dic[y]){w=y+1;break;}returnw;}voidLZW::display(intg){cout经过LZW编码后的码字如下:endl;for(inti=0;i=g;i++)coutcode[i];coutendl;cout经LZW编码后的词典如下:endl;for(intr=0;rg+3;r++)coutr+1Dic[r]endl;}voidLZW::decode(intcs[N],intlength1){intw,k;w=cs[0];intI=0;stringp1,p2;for(inti=1;ilength1;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++;coutp1;w=k;}if(i==length1)coutDic[w-1]endl;cout经LZW译码后的词典如下:endl;for(intr=0;rI+3;r++)coutr+1Dic[r]endl;}intmain(){LZWt;stringCSstream[N];intb[N];intlength,length1;coutmadeby徐国健endl;cout请输入所求码子序列的长度:;cinlength;while(length=N){cout该长度太长,请重新输入:;cinlength;}cout请输入要进行LZW编码的字符序列:endl;for(inta=0;alength;a++)cinCSstream[a];t.encode(CSstream);cout输入译码序列长度endl;cinlength1;cout输入译码序列endl;for(inti=0;ilength1;i++){cinb[i];}t.decode(b,length1);return0;}
本文标题:LZW编码与译码
链接地址:https://www.777doc.com/doc-7114978 .html