- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LZW编码算法
班级 __ __ 学号__姓名 __ ___评分__________
实验名称
LZW编码与解码算法
实验目的
2.1?通过实验进一步掌握LZW编码的原理;
?用C/C++实现LZW编。LZW编码算法的具体执行步骤如下:
步骤1:?开始时的词典包含所有可能的根(Root),而当前前缀P是空的;
步骤2:?当前字符(C)?:=字符流中的下一个字符;
步骤3:?判断缀-符串P+C是否在词典中(1)?如果“是”:P?:=?P+C?//?(用C扩展P)?;(2)?如果“否”①?把代表当前前缀P的码字输出到码字流;②?把缀-符串P+C添加到词典;③?令P?:=?C?//(现在的P仅包含一个字符C);
步骤4:?判断码字流中是否还有码字要译(1)?如果“是”,就返回到步骤2;(2)?如果“否”①?把代表当前前缀P的码字输出到码字流;②?结束。#includeiostream
#includestring
using namespace std;
const int N=200;
class LZW{
private: string Dic[200];//存放词典
int code[N];//存放编码过的码字
public: LZW(){//设置词典根
Dic[0]=a;
Dic[1]=b;
Dic[2]=c;
string *p=Dic;//定义指针指向词典中的字符}
void Bianma(string cs[N]);//进行编码
int IsDic(string e);//判断是否在词典中
int codeDic(string f);
void display(int g);//显示结果
};
void LZW::Bianma(string cs[N]){
string P,C,K;
P=cs[0];
int l=0;
for(int i=1;iN;i++){
C=cs[i];// 当前字符(C)?:=字符流中的下一个字符 K=P+C;
if(IsDic(K)) P=K;//P+C在词典中,用C扩展P
else{//P+C不在词典中
code[l]=codeDic(P);
Dic[3+l]=K;//将P+C加入词典
P=C;
l++;
}
if(N-1==i)//如果字符流中没有字符需要编码
code[l]=codeDic(P);
}
display(l);
}
int LZW::IsDic(string e){//如果字符流中还有字符需要编码
for(int b=0; b200; b++)
{ if(e==Dic[b]) return 1; }
return 0;
}
int LZW::codeDic(string f){
int w=0;
for(int y=0;y200;y++)
if(f==Dic[y]){
w=y+1;
break;
}
return w;
}
void LZW::display(int g){
cout经过LZW编码后的如下:endl;
for(int i=0;i=g;i++)
coutcode[i];
coutendl;
cout经LZW编码后的词典如下:endl;
for(int r=0;rg+3;r++)
coutr+1Dic[r]endl;
}
int main(){
LZW t;
string CSstream[N];要进行LZW编码的字符序列 int length;// 要进行LZW编码的字符序列 cout请输入所求码子序列的长度:;
cinlength;
while(length=N){
cout该长度太长,请重新输入:;
cinlength;
}
cout请输入要进行LZW编码的字符序列:endl;
for(int a=0;alength;a++)
cinCSstream[a];
t.Bianma(CSstream);
return 0;
}
软件:Windows XP操作系统、Visual C++高级语言环境。
实验结果(截图)及分析
实验存在问题和解决方法
在设计过程中,设计LZW编码的算法比较复杂,不能很快地将编码思想转化为具体的编程语言,仔细地看过书上的相关介绍并通过上网参考才完成。
实验思考题
7.1、分析LZW编码算法的优缺点。
LZW的优点是逻辑简单,实现速度快。缺点是字典的生成和查找是基于顺序插入和检索模式void update_wordlist(int*input)
{
int i=0;
int m;
k=0;
word*rear,*now
文档评论(0)