lzw实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多媒体实验

LZW编码算法

1.实验目的

1)通过实验进一步掌握LZW编码的原理;

2)用C/C++等高级程序设计语言实现LZW编码。

2.实验设备

硬件:装有32M以上内存MPC;

软件:Windows 9X/NT/XP/2000操作系统、TC 或C++等高级语言环境。3.实验设计原理

LZW编码思想:

(1)在压缩过程中动态形成一个字符列表(字典)。

(2)每当压缩扫描图像发现一个词典中没有的字符序列,就把该字符序列存到字典中,并用字典的地址(编码)作为这个字符序列的代码,替换原图像中的字符序列,下次再碰到相同的字符序列,就用字典的地址代替字符序列。

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的码字输出到码字流;

②结束。

4.程序框图

5.程序设计代码#include #include 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;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);

}

int LZW::IsDic(string e){

for(int b=0; b<200; b++) { if(e==Dic[b]) return 1; } return 0;

}

int LZW::codeDic(string f){ int w=0;

相关文档
最新文档