LZW编解码c++实现

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

参考:(22条消息) LZW编解码详解_hanzhen7541的博客-优快云博客_lzw编码

一.理论

二.编码算法

三.解码过程

四.代码实现(c++)

一.理论

把出现过的字符串映射到记号上,这样就可能用较短的编码来表示长的字符串,实现压缩。

给定一个初始字典,编码时生成补充后的字典,但不会保留,解码时再还原出编码时的字典。

二.编码算法

编码器从原字符串不断地读入新的字符,并试图将单个字符或字符串编码为记号 (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编

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值