压缩的学习1

 

 0.  为什么需要压缩?

               数据存储的需要:像google、baidu这样的搜索引擎公司,需要大量的存储设备来保存spider down的网页;如果不压缩的话,呵呵,结果可想而知。

               网络传输的需要:传输1T的数据与传输100GB的数据相比,所耗的时间显而易见。

1. 为什么可以压缩?

               数据的重复的pattern:例如:aabbcaabbc,后半段的aabbc就属于前面的重复,可以用一些标记来表示。

               字符出现的概率:高频率的字符用较少的bit数来记录,而低频率的字符就可以用较多的bit数来表示。例如:文章中只有a和b两个字符,a出现了100000次,而b只出现了1次。

2. 常见压缩算法的思路:

              基于[1]的压缩可行性,压缩算法自然可以分为以下类型:

              基于重复pattern的算法:也被成为基于词典的方法。常见的有lz系列(lzp、lz77等)、LongCommonString等。

              基于字符频率信息的算法:最经典的就是Huffman编码了。还有算术编码。

              二者结合的算法:单单使用上面某一类的算法可能达不到理想的效果,通常会有二者结合的算法,先用基于重复pattern的算法进行压缩预处理,再用基于字符频率信息的算法压缩。例如gzip(lz77+Huffman)。

              还有一种算法成为run-length coding:例如1110011110000,可以用03254来表示,0表示压缩的起始位置。

              当然,上面介绍的算法均使用在无损压缩,针对text类型的数据;和无损压缩相对应,就是有损压缩了,适用范围例如图片、视频等,但对于text就不行了。试想如果google、baidu使用有损来压缩网页,那索引库就会出错了。

3. 压缩算法的资源限制

              压缩算法通常需要考虑内存占用和性能的问题。如果占用了太多了内存,那也就是个失败的压缩算法了;如果性能太差,谁用你呢。但这个也会根据实际应用的类型来选择。

4. 实现的关键算法:

             滑动窗口:基于重复pattern的压缩算法,例如gzip里的lz77,用<start_pos,length>来替代重复出现的串,start_pos表示匹配串的起始位置,length表示匹配成功的长度。例如aabbccdaabbc,最后的aabbc可以用<1, 5>来表示,表示从第1个位置开始,长度为5。考虑到压缩的需要,start_pos和length通常有最小的限制;因为要对每个串建词典,使用滑动窗口来限制匹配的范围(只能在窗口内匹配)。

             Hash:通常用若干个字符作为上下文,来计算hash。例如:abcde,使用3个字符作为hash,hash["abc"]=1,hash[bcd]=2,表示hash值的匹配位置。当hash值冲突时,有两种处理:1.只保存最近的一个,例如lzp,这样可能会牺牲一些压缩率。2.保存若干个,例如lz77,这样在匹配时可以有选择的余地,选择length最大的一个串,获得更高的压缩比,但同时会牺牲内存和CPU。

            Huffman编码:每个字符的code都不会是其他的code的前缀。假设字符c的概率为p,那么c的code的bit数为log2(1/p),还需为整数。

            算术编码:

            统计模型:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值