原理
LZW的思想通过一系列编号来代替短语,再次遇到此短语是用编号来替代,以此来达到压缩的目的。由于词典的构建过程固定故不需要传词典,解决了码表传输的问题。解码时在解码端重建词典即可进行解码。
编码
LZW编码算法的步骤如下:
步骤1:将词典初始化为包含所有可能的单字符,当前前缀P初始化为空。
步骤2:当前字符C=字符流中的下一个字符。
步骤3:判断P+C是否在词典中
(1)如果“是”,则用C扩展P,即让P=P+C,返回到步骤2。
(2)如果“否”,则
- 输出与当前前缀P相对应的码字W;
- 将P+C添加到词典中;
- 令P=C,并返回到步骤2
由于个人水平问题,这次编码的代码使用的是老师已经给出的,包括位输入输出工具及各子函数,不做展示,每个函数的作用及返回值会在解码的代码里中标注
解码
解码的步骤如下:
-
在开始译码时词典包含所有可能的前缀根;
-
步骤2:令CW:=码字流中的第一个码字;
-
步骤3:输出当前缀-符串string.CW到码字流;
-
步骤4:先前码字PW:=当前码字CW;
-
步骤5:当前码字CW:=码字流