LZW数据压缩算法是一种基于字典的数据压缩算法,它通过构建字典来实现对输入数据的压缩。其主要流程如下:
1.初始化:先将所有单个字符加入字典中。
2.构建字典:从输入数据中读取第一个字符,然后依次读取字符直到在字典中找不到该字符串。将这个字符串(除最后一个字符)在字典中的下标输出并加入字典中,然后从下一个字符重新开始读取。
3.压缩:每次从输入数据中读取一个字符,判断是否在字典中存在。若存在,则将该字符加入已经匹配的字符串中,继续读取下一个字符;若不存在,则将已匹配的字符串在字典中的下标输出并加入字典中,然后从该字符开始重新匹配。
4.输出:将最后的已匹配的字符串在字典中的下标输出。
下面分别介绍该算法的每个步骤:
初始化
在LZW数据压缩算法中,需要一个字典来保存编码过的字符串和相应的编码。初始字典中应包含所有可能出现的单个字符和其编码。一般来说,在8位ASCII字符中,包含256个字符,因此把所有的这些字符与其编码加入到字典中。
构建字典
在开始压缩输入数据之前,需要先用输入数据构建字典。从输入数据中读取第一个字符,并将其作为当前未编码的字符串。继续读取下一个字符,将其加入到当前字符串的末尾,如果当前字符串在字典中出现过,则继续读取下一个字符,直到当前字符串在字典中不存在。此时字典新增一个编码,其值为当前已有编码数量,然后将当前字符串的前缀(去掉最后一个字符)在字典中的下标输出,并将当前字符串加入到字典中。
举个例子,假如输入数据为“ABAABABAABA”,初始字典为:
编码 | 字符 |
---|---|
0 | A |
1 | B |
2 | C |
... | ... |
在生成编码前,字典中只包含单个字符的编码。读取到第二个字符'B'时,字符串为"AB",在字典中不存在该字符串,因此将其在字典中的前缀'A'的下标0输出,将字符串"AB"加入到字典中。接着继续读取到字符'A',字符串变为"ABA",但在字典中已经存在,因此继续读取下一个字符'B',得到字符串"ABAB",在字典中仍存在,继续读取'B',此时字符串为"ABABA",在字典中不存在,因此字典新增一个编码,其值为3,将"ABAB"在字典中的前缀"ABA"的下标1输出,然后将"ABABA"加入到字典中。
接下来的过程同上,直到将数据中所有字符串都加入到字典中。
压缩
LZW压缩算法的核心部分是处理输入数据和字典大小的比对。在压缩阶段,每次从输入数据中读入一个字符,与之前匹配的字符串组成一个新的字符串,判断该字符串是否出现在字典中。若出现,则继续读入下一个字符,重新组成新字符串进行匹配;若未出现,则将之前匹配的字符串在字典中的下标输出,并将该新字符串加入到字典中。
举个例子,假如输入数据为“ABAABABAABA”,经过字典构建后,字典为:
编码 | 字符 |
---|---|
0 | A |
1 | B |
2 | C |
3 | AB |
4 | BA |
5 | ABA |
6 | ABAB |
7 | BAA |
8 | BAAB |
9 | BAABA |
开始压缩时,将第一个字符'A'读入,与之前未匹配的字符组成新字符串"AA",判断字典中是否存在该字符串,不存在,则将“A”的编码0输出,并将字符串“AA”加入到字典中作为第10个编码。接着读入'B',与“A”组成新字符串“AB”,在字典中搜索到该字符串对应的编码3,继续读入'A',与“AB”组成新字符串"ABA",在字典中没有该字符串,因此将“AB”的编码3输出,并将字符串"ABA"加入到字典中作为第11个编码。以此类推,压缩完成后得到的压缩数据为:0 1 3 0 4 6 11 3 0。
输出
在压缩结束后,需要将未输出的字符串在字典中的编码输出。
举个例子,“ABAABABAABA”这个字符串在经过压缩后,最后一个未输出的字符串为“A”,因此其在字典中的编码为0,因此在输出压缩数据的最后加入一个“0”。
至此,已经完整介绍了LZW数据压缩算法的原理分析,包括初始化、构建字典、压缩和输出四个关键步骤。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:LZW数据压缩算法的原理分析 - Python技术站