- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
南理工多媒体技术基础无损压缩编码实验
无损压缩编码实验
实验目的
掌握常见的几种无损编码方法(霍夫曼编码,算术编码,词典编码等)的原理和实现
了解并掌握如何运用C++程序实现编码
实验要求
任选一种无损编码方式,通过C++编程实现。
字符串的输入时手工输入的。
在屏幕上显示编码结果。
LZW编码基本原理
1.提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中的相应字符,减少原始数据大小。
2.看起来和调色板图象的实现原理差不多,但是应该注意到的是,我们这里的编译表不是事先创建好的,而是根据原始文件数据动态创建的,解码时还要从已编码的数据中还原出原来的编译表.
四、LZW编码算法流程
LZW算法基于转换串表(字典)T,将输入字符串映射成定长(通常为12位)的码字。在12位4096种可能的代码中,256个代表单字符,剩下3840给出现的字符串。
1)
2)读第一个输入字符给前缀串ω
3)Step: 读下一个输入字符K;
if 没有这样的K(输入已穷尽):
码字(ω) 输出;结束。
If ωK 已存在于串表中:
ωK:=ω;repeat Step;
else ωK不在于串表中:
码字(ω) 输出;
ωK加进串表;
K:=ω;repeat Step.
程序代码及注释
#includeiostream
#includestring
#includeiomanip
using namespace std;
string dic[30];
int n;
int find(string s)//字典中寻找字符串,返回序号
{
int temp=-1;
for(int i=0;i30;i++)
{
if(dic[i]==s) temp=i+1;
}
return temp;
}
void init()//字典初始化
{
dic[0]=a;
dic[1]=b;
dic[2]=c;//建立根缀表:字根为a,b,c
for(int i=3;i30;i++)//其余为空
{
dic[i]=;
}
}
void code(string str)
{
init();//初始化
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 find(w);
break;//退出for循环,编码结束
}
if(find(w+k)-1)
{
w=w+k;//w,k相加得到的字符串在字典中存在,则将此字符串赋给w所指的空间
i++;
}
else
{
cout find(w);
string wk=w+k;//w,k相加得到新的字符串赋给wk所指空间
dic[j++]=wk;//将此新的字符串写入字典
w=k;//将k所指向的内容(下一个字符)赋给w所指空间
i++;
}
}
coutendl;
for(i=0;ij;i++)
{
coutsetw(45)i+1setw(12)dic[i]endl;
}
coutendl;
}
void decode(int c[])
{
init();
int pw,cw;//cw当前码字
cw=c[0];
int j=2;//当前所看的字符在表中的位置
cout\n 译码为:;
coutdic[cw-1];//第一个译码直接输出
for(int i=0;in-1;i++)
{
pw=cw;
cw=c[i+1];//cw指向下一个字符
if(cw=j+1)
{
coutdic[cw-1];
char t[2];
t[0]=dic[cw-1][0];//将dic[cw-1]所指的字符串第一个字符给t[0]
t[1]=\0;
string k=t;
j++;
dic[j]=dic[pw-1]+k;//前一个字符串加上dic[cw-1]所指字符串的第一个字符组成新的字符串入表
}
else//不在词典中
{
char t[2];
t[0]=dic[pw-1][0];//dic[pw-1]所指的字符串第一个字符赋给t[0]
t[1]=\0;
string k=t;
文档评论(0)