字符压缩

压缩原理

字符压缩的原理其实很简单,就是找出那些重复出现的字符串,然后用更短的符号代替。这是相似性压缩,识别相似性,比如压缩7个’a’,容易实现。在我们的思维里,还有一种字符串也很有规律,比如"abcdefg",它的每个字符值递增,但是这种字符串的压缩不易实现,因为需要识别很多规则,需要先验知识,并不想我们的思维那么简单。
这里提一下香农定理,这是压缩的极限,就是在保证数据还能还原的情况下,也就是无损压缩,压缩后大小的最小值。比如每个字节的数值概率是 0~255,均匀分布每个数值出现的概率 1/256,如果一段文字的字节数值是平均分布,则 pn = 1/256,计算出极限为8。也就是说,压缩后每个字符最少用8个bit表示,这就相当于没有压缩,也可以侧面反映出"abcdefg"这样的字符串是压缩不了的。

LZ77压缩

LZ77 的主要算法逻辑就是,先通过前向缓冲区预读数据,然后再向滑动窗口移入(滑动窗口有一定的长度),不断的寻找能与字典中短语匹配的最长短语,然后通过标记符标记。下面再提示几个问题。
1、 前向缓冲区
还未处理的数据,去滑动窗口查找是否有可以匹配的字符,如果找到,可以只记录索引的位置,大小一般为100+KB。
2、滑动窗口
已经处理的数据。大小一般为4KB~32KB。
具体压缩过程见下图
在这里插入图片描述
下面是解压过程
在这里插入图片描述
3、短语字典
压缩处理后的数据,是字典,还可以再用哈夫曼对这个字典进行压缩,因为压缩后的字符出现频率可能有很大不同。
4、压缩级别
不同的压缩级别,滑动窗口的大小会不同。压缩后的数据大小和压缩所需时间会不同。
滑动窗口越小,字符串匹配效率越高,压缩速度越快,但是找到子串的概率低,压缩后较大。
滑动窗口越大,查找时间越长,但是找到子串的概率越大,压缩后就越小。

哈夫曼编码

哈夫曼设计了一个贪心算法来构造最优前缀码,被称为哈夫曼编码。具体编码过程如下:
在这里插入图片描述
图1到图6列出了整个哈夫曼树构造过程中的每个步骤。在一开始,每个字符都已经按照出现频率大小排好顺序,在后续的步骤中,每次都将频率最低的两棵树合并,然后用合并后的结果再次排序(注意,排序不是目的,目的是找到这时出现频率最低的两项,以便下次合并。gzip 源码中并没有专门去“排序”,而是使用专门的数据结构(如最小堆)把频率最低的两项找到即可)。叶子节点用矩形表示,每个叶子节点包含一个字符及其频率。中间节点用圆圈表示,包含其孩子节点的频率之和。中间节点指向左孩子的边标记为 0,指向右孩子的边标记为 1。一个字符的码字对应从根到其叶节点的路径上的边的标签序列。图 1 为初始集合,有六个节点,每个节点对应一个字符;图 2 到图 5 为中间步骤,图 6 为最终哈夫曼树。此时每个字符的编码都是前缀码。

不同的无损压缩解压算法

deflate算法就是先LZ77压缩,然后huffman编码。大部分的压缩算法都是使用的deflate算法,只不过不同的压缩格式会加上不同的包头。
gzip = gzip 头 + deflate 编码的实际内容 + gzip 尾
zlib = zlib 头 + deflate 编码的实际内容 + zlib 尾

最后再说一下,这里没有贴出具体的代码,弄懂原理,开发的过程中会使用就行。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值