不同于哈弗曼编码针对于每个元素编码,LZW主要针对字符串的编码优化,也就是把出现频率高的字符串压缩成一个字符表示,这也是大名鼎鼎的GIF采用的压缩格式。下面我将从三个角度谈谈我的一些理解,文章主要参考了这位大佬:LZW编解码详解_lzw编码-CSDN博客。
思想简述
LZW主要针对字符串压缩。比如对于字符串ABAB,首先对于每个会出现的字符都有一个默认编码,也就是A-0,B-1,因为LZW的压缩要求解压时不需要压缩编码表,因此是要求不需要编码表重建的,所以第一个A和第二个B不能连在一起压缩,分别编码为0和1;然后因为AB出现过了,记录在字典中,即AB-2,所以后面的AB就直接编码为2,编码后的字符串为012。
可以想象,如果直接把两个AB都变成2,那么压缩后是22,一上来就是一个2,那么无法重建字典了,因为这个2怎么来的无从得知。
如何压缩
压缩的过程相比解压要简单,简单来说就是维护两个字符串,分别是未编码P和当前字符C,这里的P是当前最长的可编码字符串,C就是当前指向的字符,比如xyabcdef,假设此时P起点为的a,终点是d(加粗处),此时C指向的e,假设abcd+e在字典中出现了,那么P更新为P+C也就是abcde,相当于此时还可能继续往下找到更长的编进字典;如果abcd+e没有出现在字典中,那么最长的可编码字符串就是abcd,此时为这个字符串编码,并且在字典中增加一个新的编码对应abcde,同时更新P为e(更新为指针C指向的字符),继续找下面的最长可编码字符串。
这个过程简单来说就是找最长可编码字符串,一直找到无法编码了,为字符串编码,把无法编码的加入字典。
如何解码
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。