lzw压缩是什么压缩,lzw解压缩
这篇文章最初发表在我的个人博客1。LZW基本概念之前提到的算术编码和jddy编码,重点是消除编码的冗余,本文提到的LZW编码是针对空间冗余的无错压缩方法。
LZ算法O,又称“字符串表压缩算法”,是通过构建一个由字符串和其对应的记号组成的表(将已经出现的字符串映射到标记上),用更短的代码表示更长的字符串来实现压缩。
需要注意的是,LZW算法中字符串和记号的对应关系是在压缩过程中动态生成的,并且隐含在压缩数据中。解压也是一步一步还原代码,动态生成字典的过程。
2.LZW算法详解2。LZW编码算法编码器不断从字符串中读入新的字符,并将字符或字符串映射到新的标记上,动态构建编码字典。在编码过程中,我们维护两个变量,即previous_char(表示当前可用但未编码的字符)和current_char(表示刚刚读入的字符)。编码算法流程如下
(1)初始状态,previous_char和current_char都为空。(2)读入新字符current_char,在previous中合并成一个新字符串p _ and _ c(previous _ char current _ car)。(3)在编码字典中查找p _和_c。如果P _ and _ c在字典里,previous_char=p_and_cp_and_c不在。在字典中建立p _和c的映射;更新previous_char=current_char(4)回到步骤(2)并重复,直到你读完字符串。ababcababac示例
初始状态字典中有三种默认映射。
StringSymbola0b1c2开始编码
previous _ char current _ charp _ and _ CP _ and _ c in dictionoutput " " aayprevious _ char=a-ababn添加映射{ab ,3} previous _ char=b0baban添加映射{ba ,4 } 1 ababy previous _ char=a b-abcbcn添加映射{ABC ,5)previous _ char=C3 cacan添加映射{CA ,6)previous _ char=a2 babyprevious _ char=a b-ABA ban添加映射{ABA , 7 } previous _ char=A3 ababyprevious _ char=a b-abaabayprevious _ char=ABA-abacabacn添加映射{ABAC ,8} previous _ char=c7c - 2编码完成,输出结果为0132372。 编码过程中生成的字典是:
string symbola 0 B1 C2 ab 3 ba 4 ABC 5 c 6 ABA 7 ABAC 82.2 lzw解码算法解码器输入压缩数据。同时,我们将维护两个变量,previous_symbol(当前存在但未处理的符号)和current_symbol(当前读入的符号)。算法流程如下
(1)初始状态,previous_symbol和current_symbol都为空。(2)读入第一个标志,赋给current_symbol,解码直接输出。因为第一个字符是单个字符,所以可以直接解码。(3)赋值,previous _ symbol=current_symbol(4)在字典中查找current _ symbol。如果:current_symbol在字典中:将current _ symbol解码的结果输出到previous _ char=dict . get(previous _ symbol),current _ char=dict . get(current _ symbol)[注意current _ char是current _ symbol解码的第一个字符。将p_and_c添加到新映射current_symbol不在字典中:previous _ char=dict . get(previous _ symbol),current _ char=dict . get(previous _ symbol)[0]。请注意,current_char是previous_symbol解码的第一个字符。将p _和_c添加到新的映射输出p _和_c,并返回到步骤(3 ),直到所有标记都被读取。2.4示例0 1 3 2 3 7 2
初始状态字典中有三种默认映射。
SymbolString0a1b2c开始解码:
先读取第一个符号,current_symbol=0,输出解码结果dict.get(current_symbol),即A赋值previous_symbol=current_symbol,然后循环读取后续符号。
命令输出中的previous _ symbol current _ symbol current _ symbol 01y previous _ char=a current _ char=b p _ and _ c= ab 添加映射{3, ab } b13y previous _ char=b current _ char=a p _ and _ c= ba 添加映射{ 4 . ba } ab32y previous _ char=ab current _ char=c p _ and _ c= ABC 添加映射{5, ABC } c23y previous _ char=c current _ char=a p _ and _ c=ca添加映射{ 6 . ca } ab37 nprevious _ char=ab current _ char=a p _ and _ c=ABA添加映射{7, ABA } ABA 72 yprevious _ char=ABA current _ char=c P _ and _ c=ABAC添加映射{8, abac}c解码结束,输出结果为ababcababac。 解码过程中生成的字典为
符号串0 a1 B2 C3 ab 4 ba 5 ABC 6 ca 7 ABA 8 ABAC 2.5代码实现(python)def encode _ init():k=0 char _ num _ dict={ } for I in range(97,123):char _ num _ dict[chr(I)]=kk=1 # print(char _ num _ dict。items())返回char _ num _ dict def decode _ init():k=0 num _ char _ dict={ } for I in range(97,123):num _ char _ dict[str(k)]=chr(I)k=1 # print(char _ num _ dict标记previous_char=#已有的,但未被编码的字符current_char=#当前读入的字符p_and_c=output= #输出的编码序列对于strList中的s:current _ char=sp _ and _ c=previous _ char current _ char # print(previous _ char,s)if char_num_dict.get(p_and_c)!==None:decodeList=num _ char _ dict。get(current _ symbol)previous _ char=num _ char _ dict。get(previous _ symbol)current _ char=num _ char _ dict。get(current _ symbol)[0]num _ char _ dict[str(symbol)]请输入字符序列:).下方()打印(字符序列长度:,len(strList))char _ num _ dict=encode _ init()output=LZW _ encode(strList,char _ num _ dict)print(output)num _ char _ dict=decode _ init()# print(num _ char _ dict。items())decodeList=LZW解码(output,num_char_dict)打印(decodeList)(编码长度:,len(输出)/2)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。