参考:(22条消息) LZW编解码详解_hanzhen7541的博客-优快云博客_lzw编码
一.理论
把出现过的字符串映射到记号上,这样就可能用较短的编码来表示长的字符串,实现压缩。
给定一个初始字典,编码时生成补充后的字典,但不会保留,解码时再还原出编码时的字典。
二.编码算法
编码器从原字符串不断地读入新的字符,并试图将单个字符或字符串编码为记号 (Symbol)。这里我们维护两个变量,一个是P (Previous),表示手头已有的,还没有被编码的字符串,一个是C (current),表示当前新读进来的字符。
1. 初始状态,字典里只有所有的默认项,例如0->a,1->b,2->c。此时P和C都是空的。 2. 读入新的字符C,与P合并形成字符串P+C。 3. 在字典里查找P+C,如果: - P+C在字典里,P=P+C。 - P+C不在字典里,将P的记号输出;在字典中为P+C建立一个记号映射;更新P=C。 4. 返回步骤2重复,直至读完原字符串中所有字符。
以上表示的是编码中间的一般过程,在收尾的时候有一些特殊的处理,即步骤2中,如果到达字符串尾部,没有新的C读入了,则将手头的P对应的记号输出,结束。
编码过程的核心就在于第3步,我们需要理解P究竟是什么。P是当前维护的,可以被编码为记号的子串。注意P是可以被编码为记号,但还并未输出。新的字符C不断被读入并添加到P的尾部,只要P+C仍然能在字典里找到,就不断增长更新P=P+C,这样就能将一个尽可能长的字串P编

本文详细介绍了LZW编解码的理论、编码算法和解码过程,并提供了C++代码实现。通过例子说明了编码过程中如何利用字典进行字符串压缩,以及解码时如何还原编码字典,最终实现数据的压缩与解压缩。
最低0.47元/天 解锁文章
1433

被折叠的 条评论
为什么被折叠?



