LZ4压缩算法分析

LZ4压缩算法是LZ算法系列中的一种,并且网上也号称是目前最快的压缩算法之一,现没时间亲测也不对LZ系列算法展开讨论只分析LZ4。LZ4算法有两种压缩方法,一种侧重于压缩速度,另外一种侧重于压缩比,现讨论的是侧重于压缩速度的方法。算法

现给定字符串dfabcdefghijklmnabcdkkkkkk,后面出现的“abcd”能够用前面的“abcd”经过偏移量offset与匹配长度matchLength进行代替,实际上这就是LZ4算法的主要思想。LZ4算法的最小匹配长度是4,最后5个字符按照字面量存储,也就是说当字节数<=9时是不压缩的(最后会给出解释)。测试

详细的LZ4编码数据涉及到的变量以下:优化

一、字面量值literalValue,即dfabcdefghijklmn编码

二、字面量值长度literalLength=16token

三、匹配长度matchLength=4字符串

四、偏移量offset=16-2=14源码

编码格式以下:it

token_literalLength(可选)_literalValue_offset_matchLength(可选)变量

token占用1个字节,前4位表明字面量值长度,若是长度值>=15与255(1个字节的无符号数)进行比较,若是比255大则减去255并写入1个字节,将剩余的值如此循环比较,反之直接写入1个字节。如字面量长度值为512,token前4位等于15,  literalLength等于512-15=255+242占用两个字节。后四位表示匹配的长度,原理和前面同样,在实现的时候能够优化一下,由于默认最小匹配长度为4,因此能够将值减4。如匹配长度为512,token后4位等于15,matchLength等于512-4-15=255+238占用两个字节。literalLength与matchLength为何要加入可选,就是这个缘由,由于值小于15的时候,4个比特位已经足够表示了。offset占用2个字节,即最大值为65535。原理

上面的字符串压缩后的字节序列是(0b11110000)_(1)_(dfabcdefghijklmn)_(14)------(0b01100000)_(kkkkkk)

问题一:为何最小匹配值为4?

我我的的理解是由于token占1个字节、offset占2个字节,只有匹配值大于3的时候才有可能起到压缩效果。注:为何是“有可能”呢,由于压缩算法是基于几率的,好比上面的例子并无起到压缩效果,反而多占一个字节。

问题二:为何最后的5个字节按照字面量直接存储?

我我的的理解是假设给定9个字节的字符串abcdabcde,按照正常流程压缩时格式以下:(0b01000000)_(abcd)_(4)------(0b00010000)_(e),一样占了9个字节,没有起到压缩效果。注意(4)是占2个字节的。

有兴趣的能够对着lucene的LZ4源码,照着上面的例子验证一下,本人已经测试过了。

相关文章
相关标签/搜索