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

  • 34
  • 0
  • 约5.74千字
  • 约 8页
  • 2018-01-11 发布于福建
  • 举报
一、实验名称 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.C。这个新的缀-符串(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       B       C   1 (4) A B (1) 2 2 (5) B B (2) 3 3 (6) B A (2) 4 4 (7) A B A (4) 5 6 (8) A B A C (7) 6 -- -- -- (3) 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编码算法的具体执行步骤如下: 步骤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的码字输出到码字流; ② 结束。 LZW译码算法的具体执行步骤如下: 步骤1: 在开始译码时词典包含所有可能的前缀根(Root)。 步骤2: cW :=码字流中的第一个码字。 步骤3: 输出当前缀-符串string.cW到码字流。 步骤4: 先前码字pW := 当前码字cW。 步骤5: 当前码字cW := 码字流中的下一个码字。 步骤6: 判断先前缀-符串string.pW是否在词典中 (1) 如果“是”,则: ① 把先前缀-符串string.pW输出到字符流。 ② 当前前缀P :=先前缀-符串string.pW。 ③ 当前字符C :=当前前缀-符串string.cW的第一个字符。 ④ 把缀-符串P+C添加到词

文档评论(0)

1亿VIP精品文档

相关文档