LZW算法问题
LZW算法中有几个重要的概念:字符、字符串和编码表。它把数据流看成一个字符序列,把字符序列组织成一系列的字符串,并给每个字符串一个代码,最后把字符串的代码存储起来,这样就节省了空间。比如ababba可以表示为代码1532,1523可以表示为12bit,比原来的5*8bit节省了不少空间。LZW的编码表是动态创建的,可以从编码后的数据流中恢复出相同的编码表,这样在存储和传输数据时就不需要保存原始的编码表,这也和一些编码前有固定编码表的算法有很大的区别。
1.编码过程:
LZW是一种定长编码算法,即每个字符或字符串的编码长度相等。为了便于说明,我决定用16bit作为编码,前255作为字符编码,其他用256,257,将在3中说明。所以字符串的编码会从258开始。
编码的整个过程如下:
1.初始化编码表,对起始编号进行编码,并将当前字符串设置为空;
2.读取一个字符,如果是EOF,输出当前字符串,结束,否则输入3;
3.将新读取的字符和当前字符串组成新的字符串。如果新的字符串出现在编码表中,进行到2;否则,进行到4;
4.将新字符串添加到编码表中,分配编号,设置当前字符串的长度为N,输入新字符串的长度前缀编码N-1,设置当前字符串为当前字符串的后缀1,然后执行2。
2.解码过程:
对于解码,你唯一需要知道的就是代码的长度。每次从编码流中读取对应位的长度,就形成了一个代码,然后通过这个代码就可以从编码表中找到对应的字符串并输出。由于没有存储对应的编码表,解码时需要同时构造编码表。
解码过程如下:
1.初始化码表,将前面的代码设置为空;
2.选择一个代码,如果代码是End,它就是End。否则,进行到3;
3.输出代码表示的字符串。如果前一个代码不为空,则将前一个代码的字符串和当前字符串的第一个字符作为新字符串添加到代码表中,将前一个代码设置为当前代码,执行2。