为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

LZW编码算法

2019-02-18 14页 doc 30KB 22阅读

用户头像

is_654168

暂无简介

举报
LZW编码算法班级 __ __ 学号__姓名 __ ___评分__________          1. 实验名称 LZW编码与解码算法 2. 实验目的 2.1 通过实验进一步掌握LZW编码的原理; 2.2 用C/C++等高级程序设计语言实现LZW编码 。 3. 实验内容步骤或记录(包括源程序或流程和说明等) 3.1 实验原理 (1)在压缩过程中动态形成一个字符列表(字典)。 (2)每当压缩扫描图像发现一个词典中没有的字符序列,就把该字符序列存到字典中,并用字典的地址(编码)作为这个字符序列的代码,替换原图像中的字符序列,下次再碰到相...
LZW编码算法
班级 __ __ 学号__姓名 __ ___评分__________          1. 实验名称 LZW编码与解码算法 2. 实验目的 2.1 通过实验进一步掌握LZW编码的原理; 2.2 用C/C++等高级程序设计语言实现LZW编码 。 3. 实验内容步骤或记录(包括源程序或流程和说明等) 3.1 实验原理 (1)在压缩过程中动态形成一个字符列表(字典)。 (2)每当压缩扫描图像发现一个词典中没有的字符序列,就把该字符序列存到字典中,并用字典的地址(编码)作为这个字符序列的代码,替换原图像中的字符序列,下次再碰到相同的字符序列,就用字典的地址代替字符序列 3.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的码字输出到码字流; ② 结束。 3.3 源程序 #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>length; while(length>=N){ cout<<"该长度太长,请重新输入:"; cin>>length; } cout<<"请输入要进行LZW编码的字符序列:"<>CSstream[a]; t.Bianma(CSstream); return 0; } 4. 实验环境(包括软、硬件平台) 硬件:装有32M以上内存MPC; 软件:Windows XP操作系统、Visual C++高级语言环境。 5. 实验结果(截图)及分析 6. 实验存在问题和解决 在设计过程中,设计LZW编码的算法比较复杂,不能很快地将编码思想转化为具体的编程语言,仔细地看过书上的相关介绍并通过上网参考才完成。 7. 实验思考题 7.1、分析LZW编码算法的优缺点。 LZW的优点是逻辑简单,实现速度快。缺点是字典的生成和查找是基于顺序插入和检索模式,需要处理的数据量较大时会降低查找效率。 7.2、试编写LZW解码算法。 void update_wordlist(int*input) { int i=0; int m; k=0; word*rear,*now,*current,*next; wordlist* wl_out,*wl_pre; wl_pre=NULL;//起始时先前前缀为空 while(inext;      //在词典中找待译码字对应的前缀 if(wl_out!=NULL)//如果词典中有码字对应的前缀 { now=wl_out->w_head; while(now!=NULL)//将此前缀存入到输出字符串中 { output[k]=now->letter; now=now->next; k++; } if(wl_pre!=NULL)//先前前缀不空即不是译第一个码字时 {current=new word;//将当前前缀的第一个字符取出 current->letter=wl_out->w_head->letter; current->next=NULL; wl_rear=new wordlist;//在词典末尾存入新的前缀 wl_now->next=wl_rear; wl_now=wl_rear; wl_rear->w_head=NULL; wl_rear->next=NULL; next=wl_rear->w_head; now=wl_pre->w_head; while(now!=NULL) { if(next==NULL)//存入第一个字符与存入其他字符 {//操作不同 rear=new word; rear->letter=now->letter; rear->next=NULL; wl_rear->w_head=rear; next=wl_rear->w_head; } else { rear=new word; rear->letter=now->letter; rear->next=NULL; next->next=rear; next=rear; } now=now->next; } next->next=current;//将当前前缀的第一个字符加到新前缀 } } else//词典中不含待译码字对应的前缀时 { now=wl_pre->w_head;//将先前前缀的第一个字符取出 current=new word; current->letter=now->letter; current->next=NULL; wl_rear=new wordlist;//在词典末尾存入新前缀 wl_now->next=wl_rear; wl_now=wl_rear; wl_rear->next=NULL; wl_rear->w_head=NULL; next=wl_rear->w_head; while(now!=NULL) { if(next==NULL)//存入第一个字符与存入其它字符 {//操作不同 rear=new word; rear->letter=now->letter; rear->next=NULL; wl_rear->w_head=rear; next=wl_rear->w_head; } else { rear=new word; rear->letter=now->letter; rear->next=NULL; next->next=rear; next=rear; } now=now->next; } next->next=current;//将先前前缀的第一个字符 wl_out=wl_rear;//存入到新前缀末尾 now=wl_rear->w_head; while(now!=NULL)//将新前缀存入到输出字符串 { output[k]=now->letter; now=now->next; k++; } } wl_pre=wl_out;//当前前缀赋给先前前缀 i++; } 8. 实验心得和建议 通过这次实验,我们对LZW编码的思想和具体实现有了更深刻的了解。我们不仅仅局限于简单的书面运算,编程上的实现对很多细节有着更多的要求。这次实验锻炼了思考问题和解决问题的能力。
/
本文档为【LZW编码算法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索