参考http://bcb.lcsoft.net/document-2027.html
我是参照他括号里给出不同的实现,即“STRING = STRING + CHARACTER" 和 “CHARACTER = first character in STRING "
参考博文对LZW算法的解释比较详细。所以这里我只谈谈我个人是如何理解这个算法。表达不是很清晰,请原谅。
压缩过程不难理解。我主要说说解压过程。
无论是压缩还是解压,都是围绕字典展开的。所以要理解LZW算法,应该首先明白字典创建以及还原的原理。
所以,如何理解算法中的这句话“add OLD_CODE + CHARACTER to the translation table ”是关键。我的理解是OLD_CODE是上一个数字代码对应的字符串(对应程序中变量oldCodeStr),CHARACTER是当前数字代码对应字符串的首个字符(对应程序中curCodeStr[0])。
我们知道,每个代码数字(设为x)被输出都是有原因的。原因就是遇到了字典中没有的字符串(设为字符串a)。为了可以还原字典,我们要得到a。而由压缩的原理可知,a = (x在字典中对应的字符串(设为b)) + (原字符流中b后面紧接着的字符(设为c))(对应语句3)。(因为在压缩时,遇到字典中没有的字符串时,是将这个字符串的前缀的代码数字输出的,反过来,代码数字对应的字符串也只是所遇到的字典中没有的字符串的前缀)。其中c也就是下一个数字代码所对应字符串的首个字符。
也就是说,每一个数字都代表着压缩时字典多了一个条目。而这个