ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

字符压缩

2022-03-21 18:32:28  阅读:168  来源: 互联网

标签:编码 哈夫曼 字符 压缩 滑动 节点


压缩原理

字符压缩的原理其实很简单,就是找出那些重复出现的字符串,然后用更短的符号代替。这是相似性压缩,识别相似性,比如压缩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 尾

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

标签:编码,哈夫曼,字符,压缩,滑动,节点
来源: https://blog.csdn.net/m0_65931372/article/details/123642413

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有