【摘 要】 在分析lz算法的基础上,对lz算法的缺陷进行了探讨。并对lz算法进行了改进,大幅度减少了编码的长度,降低了匹配长度取值变化的影响,完全兼容lz算法,在平均压缩率方面有较大的提高,而且对改进的算法进行了分析论证。
【关键词】 数据压缩 lz算法 缓冲区
lz算法的实质是无损压缩技术[1-3],lz算法通过对输入流进行分析,自适应地生成一个包含输入流中不重复子串的串表,将每一子串映射为一独立的码字输出。这样,它就充分利用了相邻输入之间的相关性,可以取得超过信源一阶熵的编码效率。然而,受缓存容量、计算复杂度和计算速度等因素的限制,串表的长度受到一定限制,且一般信源所具有的局部平稳性随缓存容量加大,编码效率提高不大。即:它自身固有一定的缺陷与不足,难以满足人们的需要,对它进行改进一直成为人们的研究目标之一[4-6]。为了解决这一问题,本文对lz算法进行了改进,命名为lz编码算法。它兼有lz算法的优点,还具有自身的优越性。首先对lz算法进行一些必要的介绍和分析。
1. lz算法
lz算法[1]由韦尔奇(t.a.elh)于1984年通过对lz算法的改进。开发出的一种更优算法。它是一种基于字典的编码方法。并且它是lz系列码中应用最广,变形最多的一种算法。lz压缩有3个重要的对象:数据流、编码流和编译表。在编码时,数据流是输入对象,编码流就是输出对象;在解码时,编码流则是输入对象,数据流是输出对象;而编译表是在编码和解码时都需要借助的对象。
1.1lz算法的编码原理
lz算法的编码原理为:对消息序列xn=x1x2x3…xn从左到右进行阅读,并以此进行lz编码:
(1)对x1显然是第一次出现,它的前面也没有字符,那么他的编号是1,它的码元为(1,0, x1)。
(2)对于x2它可能有两种情况发生,即x1=x2或x1≠x2。对此,有
①如果x1=x2,那么对于x2不作编码,而对x3的编码位点取2,连接位点则为1,这表示对x3作第二次编码,它与第一次编码的x1相连接。
②如果x1≠x2,那么x2的编码位点取为2,连接位点则为0,这表示对x2作第二次编码,它的前面没有出现过相同的字符。
(3)依照上述步骤递推,如果对向量xn=x1x2x3…xn,n<,我们已经得到它的编码:={(i,li, xji),i=1,2, …, k }.
对上式的满足的条件:对每一个i有且只有一对(i,li),使li<i<ji成立。那么构成一lz树。由树的构造可知,对每个点i,它的枝li是唯一的。因此,树的全部枝为li,i=0,1,…,k 确定,而且每个li与xn中的子向量xαi对应。
(4)如向量xn中的编码及相应的树确定,那么我们就可读xn+1,xn+2,…, xn+k,并对它们继续进行编码,如果有一个i≦k使xαi=(xn+1,xn+2,…, xn+k)成立,而且对任何i≦k都有:xαi≠( xn+1,xn+2,…, xn+k,xn+k+1)成立。那么:
①不对字符xn+1,xn+2,…, xn+k进行编码。
②对xn+k+1作它的编码为(k+1,i, xn+k+1)。
未完...点击下方链接下载完整文档