7zip核心算法LZMA分析心得
- 最近有空就研究了一下DEFLATE的LZ77压缩算法实现及7zip的LZMA压缩算法实现,现在记下相关心得如下:
一、 DEFLATE中的LZ77算法实现比较简单,具体研究的是github上的一个精简版实现miniz,源码可见https://gitee.com/tigerzyj/miniz。有几个要点要注意,一是基于字节流的字典匹配,二是哈夫曼编码,详情可以参阅RFC1951,那里说的很清楚了。有特色是哈夫曼编码的ALISTAIR MOFFAT实现方法,有些难理解,找到他的论文并亲自在纸上推算一下就能理解了。
二、
7zip中的LZMA编码是在LZ77算法上加入了基于比特流及马尔科夫链上下文的区间编码(range code)以及基于动态规划(Dynamic Programming)的深度优化,并扩大了DEFLATE中32K的字典到默认的8M(或16M,根据版本不同),理论上最大可以到4G,实际实现中最大为1536 MB,32位7zip实现中最大为128M。详情可以参见维基百科上的https://en.wikipedia.org/wiki/Lempel–Ziv–Markov_chain_algorithm,(转载地址https://www.cnblogs.com/tigerzyj/p/15334782.html)文章其它地方说得比较清楚,但DP优化说得很简单,不太好理解,看了源码花了N个小时才算看明白。具体看的源码是lzma1900的cs实现,这个实现与java实现比较容易理解。下载地址为
https://www.7-zip.org/a/lzma19