从256开始,但是这样一来就超过了8位的表示范围了,所以必须要扩展数据的位数,至少扩展一位,但是这样不是增加了1个字符占用的空间了么?但是却可以用一个字符代表几个字符,比如原来255是8bit但是现在用256来表示254,255两个数,还是划得来的。从这个原理可
4
f以看出LZW算法的适用范围是原始数据串最好是有大量的子串多次重复出现,重复的越多,压缩效果越好。反之则越差,可能真的不减反增了。
算法中得特殊标记六、LZW算法中得特殊标记
随着新的串stri
g不断被发现,标号也会不断地增长,如果原数据过大,生成的标号集(stri
gtable会越来越大,这时候操作这个集合就会产生效率问题。如何避免这个问题呢Gif在采用lzw算法的做法是当标号集足够大的时候,就不能增大了,干脆从头开始再来,在这个位置要插入一个标号,就是清除标志CLEAR,表示从这里我重新开始构造字典,以前的所有标记作废,开始使用新的标记。这时候又有一个问题出现,足够大是多大?这个标号集的大小为比较合适呢?理论上是标号集大小越大,则压缩比率就越高,但开销也越高。一般根据处理速度和内存空间连个因素来选定。GIF规范规定的是12位,超过12位的表达范围就推倒重来,并且GIF为了提高压缩率,采用的是变长的字长。比如说原始数据是8位,那么一开始,先加上一位再说,开始的字长就成了9位,然后开始加标号,当标号加到512时,也就是超过9为所能表达的最大数据时,也就意味着后面的标号要用10位字长才能表示了,那么从这里开始,后面的字长就是10位了。依此类推,到了212也就是4096时,在这里插一个清除标志,从后面开始,从9位再来。GIF规定的清除标志CLEAR的数值是原始数据字长表示的最大值加1,如果原始数据字长是8,那么清除标志就是256,如果原始数据字长为4那么就是16。另外GIF还规定了一个结束标志END,它的值是清除标志CLEAR再加1。由于GIF规定的位数有1位(单色图)位(16色)和8位(256色),4,而1位的情况下如果只扩展1位,只能表示4种状态,那么加上一个清除标志和结束标志就用完了,所以1位的情况下就必须扩充到3位。其它两种情况初始的字长就为5位和9位
算法的伪代码实现七、LZW算法的伪代码实现
1STRINGgeti
putcharacter2WHILEtherearestilli
putcharactersDO3CHARACTERgeti
putcharacter
5
f45678910
IFSTRINGCHARACTERisi
thestri
gtablethe
STRINGSTRINGcharacterELSEoutputthecodeforSTRINGaddSTRINGCHARACTERtothestri
gtableSTRINGCHARACTERENDofIF
11ENDr