lzw编解码实验报告 含程序和注释.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一\实验名称 LZW编码及译码 二、实验目的 1、 熟悉和巩固信息论课程屮有关信源编码屮LZW编码的原理、方法。 2、 会用VC调试和验证LZW编码译码程序,提高分析程序的能力 3、 将所学的理论知识进行上机实践。 三、 实验要求 设计一个LZW编码/译码系统,掌握LZW编码的特点、存储方法和基本原理, 培养利用C++语言编写程序以及调试程序的能力,运用信息论知识解决实际问 题的能力。用C语言实现LZW编/译码的相关函数的基本框架设计,如LZW树 的构建,LZW编码的实现,LZW译码的实现等。 四、 实验原理 由韦尔奇在1984年开发的LZW算法,是LZ系列码中应用最广泛、变形最 多的。它是先建立初始字典,在分解输入流为短语词条,这个短语若不在初始 字典中,就将其存入字典,这些新词条和初始字典共同构成编码器字典。而初 始字典可由信源符号集构成,每一个符号是一个词条。 1、编码原理:LZW编码器使用了一种很实用的分析(parsing)算法,称为贪 婪分析算法(greedy parsing algorithm)。在贪婪分析算法中,每一次分析都要串 行地检查来自字符流(Charstream)的字符串,从中分解出已经识别的最长的字符 串,也就是已经在词典中出现的最长的前缀(Prefix)。用已知的前缀(Prefix)加上 下一个输入字符C也就是当前字符(Current character)作为该前缀的扩展字符, 形成新的扩展字符串——缀-符申(String): Prefix.Co这个新的缀-符申(String)是 否要加到词典中,还要看词典中是否存有和它相同的缀-符串String。如果有, 那么这个缀-符串(String)就变成前缀(Prefix),继续输入新的字符,否则就把这个 缀-符串(String)写到词典中生成一个新的前缀(Prefix),并给一个代码。 编码示例: 被编码的字符申 位置 1 2 3 4 5 6 7 8 9 字符 A B B A B A B A C LZW的编码过程 步骤 位置 词典 输岀 ⑴ A (2) B (3) C 1 1 ⑷ AB (1) 2 2 (5) BB (2) 3 3 (6) BA (2) 4 4 (7) AB A (4) 5 6 (8) ABAC (7) 6 麵? 一 一 ⑶ 2、解码原理: LZW译码算法中会用到另外两个术语:①当前码字(Current code word): 指当前正在处理的码字,用cW表示,用string.cW表示当前缀-符串;②先 前码字(Previous code word):指先于当前码字的码字,用pW表示,用 string.pW表示先前缀-符串。LZW译码算法开始时,译码词典与编码词典相 同,它包含所有可能的前缀根(roots)。LZW算法在译码过程中会记住先前码 字(pW),从码字流中读当前码字(cW)之后输出当前缀-符串string.cW,然后 把用string.cW的第一个字符扩展的先前缀-符串string.pW添加到词典中。 五、实验内容步骤及方案 木实验主要有四个函数: 1、 编码函数:code() 2、 译码函数:decode() 3、 字典查找函数:find() 4、 字典初始化函数:init() LZW编码算法的具体执行步骤如下: 步骤h开始时的词典包含所有可能的根(Root),而当前前缀P是空的; 步骤2:当前字符(C):=字符流中的下一个字符; 步骤3:判断缀-符串P+C是否在词典中 如果“是”:P : =P+C//(用 C 扩展 P); 如果“否” 把代表当前前缀P的码字输出到码字流; 把缀-符串P+C添加到词典; 令P : =C//(现在的P仅包含一个字符C); 步骤4:判断码字流中是否还有码字要译 如果“是”,就返冋到步骤2; 如果“否” 把代表当前前缀P的码字输出到码字流; 结束。 LZW译码算法的具体执行步骤如下: 步骤h在开始译码时词典包含所有可能的前缀根(Root)。 步骤2: cW :=码字流中的第一个码字。 步骤3:输出当前缀-符串string.cW到码字流。 步骤4:先前码字pW :=当前码字cW。 步骤5:当前码字cW :=码字流中的下一个码字。 步骤6:判断先前缀-符串string.pW是否在词典屮 (1)如果“是”,贝IJ: 把先前缀-符串string.pW输出到字符流。 当前前缀P :=先前缀-符串string.pW。 当前字符C :=当前前缀-符串string.cW的第一个字符。 把缀-符串P+C添加到词典。 (2)如果“否”,贝IJ: 当前前缀P :=先前缀-符串string.pW。 当前字符C :=当前缀-符串string.cW的第一个字符。 输出缀-符串P+C到字符流,然后把它添加到词典中。 步骤7:判断码字

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档