南京理工大学多媒体实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南京理工大学多媒体实验报告
无损数据压缩实验报告
班级:
学号:
姓名:
012年1月10日
LZW算法压缩编码技术
1.设计思路:
LZW就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩. 字符串和编码的对应关系是在压缩过程中动态生成的,并且隐含在压缩数据中,解压的时候根据表来进行恢复,是一种无损压缩. .在本次实验中我们就进行了LZW编码以及译码简单算法的编写。
LZW编码又称字串表编码,是无损压缩技术改进后的压缩方法。它采用了一种先进的串表压缩,将每个第一次出现的串放在一个串表当中,用一个数字来表示串,压缩文件只进行数字的存贮,则不存贮串,从而使图像文件的压缩效率得到了较大的提高。
LZW压缩算法的基本原理:提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中的相应字符,减少原始数据大小。
应该注意到的是,这里的编译表不是事先创建好的,而是根据原始文件数据动态创建的,解码时还要从已编码的数据中还原出原来的编译表.对于字符串流,我们要进行分析,从词典中寻找最长匹配串,即字符串P在词典中,而字符串P+后一个字符C不在词典中。此时,输出P对应的码字,将P+C放入词典中。经过努力,
我初步知道了对于一个字符串进行编码的过程。
2.步骤
(1)根据需要得建立一个初始化词典。这里字根分别为 A B C。具体的初始化算法如下:
void init()//词典初始化
{
dic[0]="A";
dic[1]="B";
dic[2]="C";//字根为A,B,C
for(int i=3;i<30;i++)//其余为空
{
dic[i]="";
}
}
(2)对于编码算法的建立,则需先建立一个查找函数,用于查找返回序号:int find(string s)
{
int temp=-1;
for(int i=0;i<30;i++)
{
if(dic[i]==s) temp=i+1;
}
return temp;
}
(3) 编写编码算法:
void code(string str)
{
int();//初始化
char temp[2];
temp[0]=str[0];//取第一个字符
temp[1]='\0';
string w=temp;
int i=1;
int j=3;//目前字典存储的最后一个位置
cout<<"\n 编码为:";
for(;;)
{
char t[2];
t[0]=str[i];//取下一字符
t[1]='\0';
string k=t;
if(k=="") //为空,字符串结束
{
cout<<" "< break;//退出for循环,编码结束 } if(find(w+k)>-1) { w=w+k; i++; } else { cout<<" "< string wk=w+k; dic[j++]=wk; w=k; i++; } } cout< for(i=0;i { cout< } cout< } (4) 译码是编码的逆过程。在译码中根缀表仍为A,B,C。且定义如下变量StringP :前一步码字流 pW : StringP的第一个字符 StringC :当前的码字流 cW : StringC的第一个字符 结合老师给的前两步译码过程,得到译码算法如下: void decode(int c[]) { init(); int pw,cw; cw=c[0]; int j=2; cout<<"\n 译码为:"; cout< for(int i=0;i { pw=cw; cw=c[i+1]; if(cw<=j+1) { cout< char t[2]; t[0]=dic[cw-1][0]; t[1]='\0'; string k=t; j++; dic[j]=dic[pw-1]+k; } else { char t[2]; t[0]=dic[pw-1][0]; t[1]='\0'; string k=t; j++; dic[j]=dic[pw-1]+k; cout< } } cout< for(i=0;i { cout< } cout< } (5) 最后的主函数用菜单的方式编写:a.编码 b.译码。 3.程序源代码: #include #include #include using namespace std;