主题:对于LZMA算法,7Z格式
零度蒸汽
[专家分:0] 发布于 2006-08-04 14:51:00
哪位高手有研究?我始终不知道LZMA算法到底是怎么回事
实在是菜鸟,请指教
回复列表 (共4个回复)
沙发
euc [专家分:4310] 发布于 2006-08-04 18:23:00
找到一个lz77的,但lzma是建立其上的,也能凑合吧。关于字符串匹配的方法我还没搞清:
////////////////////////////////////////////////////////////////////
[转]:http://blog.csdn.net/windcsn/archive/2006/01/06/572389.aspx
Lempel-Ziv (LZ77)
Lempel-Ziv压缩模式有许多不同的变量。基本压缩库有清晰的LZ77算法的实现(Lempel-Ziv,1977),执行的很好,源代码也非常容易理解。
LZ编码器能用来通用目标的压缩,特别对于文本执行的很好。它也在RLE和哈夫曼编码器(RLE,LZ,哈夫曼)中使用来大多数情况下获得更多的压缩。
4.1. 原理
在LZ压缩算法的背后是使用RLE算法用先前出现的相同字节序列的引用来替代。
简单的讲,LZ算法被认为是字符串匹配的算法。例如:在一段文本中某字符串经常出现,并且可以通过前面文本中出现的字符串指针来表示。当然这个想法的前提是指针应该比字符串本身要短。
例如,在上一段短语“字符串”经常出现,可以将除第一个字符串之外的所有用第一个字符串引用来表示从而节省一些空间。
一个字符串引用通过下面的方式来表示:
1. 唯一的标记
2. 偏移数量
3. 字符串长度
由编码的模式决定引用是一个固定的或变动的长度。后面的情况经常是首选,因为它允许编码器用引用的大小来交换字符串的大小(例如,如果字符串相当长,增加引用的长度可能是值得的)。
4.2. 实现
使用LZ77的一个问题是由于算法需要字符串匹配,对于每个输入流的单个字节,每个流中此字节前面的哪个字节都必须被作为字符串的开始从而尽可能的进行字符串匹配,这意味着算法非常慢。
另一个问题是为了最优化压缩而调整字符串引用的表示形式并不容易。例如,必须决定是否所有的引用和非压缩字节应该在压缩流中的字节边界发生。
基本压缩库使用一个清晰的实现来保证所有的符号和引用是字节对齐的,因此牺牲了压缩比率,并且字符串匹配程序并不是最优化的(没有缓存、历史缓冲区或提高速度的小技巧),这意味着程序非常慢。
另一方面,解压缩程序非常简单。
一个提高LZ77速度的试验已经进行了,这个试验中使用数组索引来加速字符串匹配的过程。然而,它还是比通常的压缩程序慢。
板凳
零度蒸汽 [专家分:0] 发布于 2006-08-04 23:34:00
其实,我真得很想从代码上得到启发,但很可惜,没看懂。代码上要有注释就好了
不明白LZMA对LZ77的改进在哪儿,反正,我是不懂
3 楼
euc [专家分:4310] 发布于 2006-08-05 12:57:00
我觉得先懂原理在看代码就easy多了.
4 楼
零度蒸汽 [专家分:0] 发布于 2006-08-10 01:10:00
就是不懂原理阿,很久了都没懂
我来回复