【压缩原理】 deflate 算法
目录
1 概述
2 LZ77算法原理
2.1 压缩
2.2 解压缩
3 Huffman编码
3.1 构造霍夫曼树
4 参考
1 概述
DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。DEFLATE压缩与解代码可以在自由、通用的压缩库zlib上找到。常见的压缩算法如下:
- zlib(RFC1950):一种格式,是对deflate进行了简单的封装,zlib = zlib头 + deflate编码的实际内容 + zlib尾
- gzip(RFC1952):一种格式,也是对deflate进行的封装,gzip = gzip头 + deflate编码的实际内容 + gzip尾
2 LZ77算法原理
LZ77算法是采用字典做数据压缩的算法,由以色列的两位大神Jacob Ziv与Abraham Lempel在1977年发表的论文《A Universal Algorithm for Sequential Data Compression》中提出。
基于统计的数据压缩编码,比如Huffman编码,需要得到先验知识——信源的字符频率,然后进行压缩。但是在大多数情况下,这种先验知识是很难预先获得。因此,设计一种更为通用的数据压缩编码显得尤为重要。LZ77数据压缩算法应运而生,其核心思想:利用数据的重复结构信息来进行数据压缩。
在具体实现中,用滑动窗口(Sliding Window)字典存储历史字符,Lookahead Buffer存储待压缩的字符,Cursor作为两者之间的 分隔,如图所示:
并且字典与Lookahead Buffer的长度是固定的。
2.1 压缩
用(p,l,c)表示Lookahead Buffer中字符串的最长匹配结果,其中
- p表示最长匹配时,字典中字符开始时的位置(相对于Cursor位置),
- l为最长匹配字符串的长度,
- c指Lookahead Buffer最长匹配结束时的下一字符
压缩的过程,就是重复输出(p,l,c),并将Cursor移动至l+1,伪代码如下:
Repeat:Output (p,l,c),Cursor --> l+1
Until to the end of string
压缩示例如图所示:
2.2 解压缩
为了能保证正确解码,解压缩时的滑动窗口长度与压缩时一样。在解压缩,遇到(p,l,c)大致分为三类情况:
- p==0且l==0,即初始情况,直接解码cc;
- p>=l,解码为字典
dict[p:p+l+1]
; - p<l,即出现循环编码,需要从左至右循环拼接,伪代码如下:
for(i = p, k = 0; k < length; i++, k++)out[cursor+k] = dict[i%cursor]
比如,dict=abcd
,编码为(2,9,e)
,则解压缩为output=abcdcdcdcdcdce。
3 Huffman编码
在传输电文时,每种字符出现的频率不同,想让电文在能够表达其意思的前提下尽可能短,自然需要让出现频率高的字符占的位数尽可能少。
3.1 构造霍夫曼树
假如某一个文本只包含wuvxy等字符,如图对此进行如下构造过程:
- 步骤一:统计文本的各权重分别为7,12,15,18,20
- 步骤二:7,12,15,18,20选出权重最小的7、12进行构造生成19
- 步骤三:19,15,18,20选出权重最小的15,18进行构造生成33
- 步骤四:19,33,20选出权重最小的19,20进行构造生成39
- 步骤五:33,39进行构造生成72
4 参考
1、【数据压缩】LZ77算法原理及实现
2、zlib-Deflate压缩算法
3、数据压缩算法---霍夫曼编码的分析与实现
4、详解Huffman压缩原理和c++代码实现
【压缩原理】 deflate 算法相关推荐
- 数据流压缩原理实现(huffman编码,LZ77压缩算法)
1. 压缩原理deflate算法 a) LZ77 算法原理 b) Huffman算法原理 c) Huffman算法测试实例 2. 关于zlib库的实际应用以及gzip格式分析查看下一篇 一.数据压缩 ...
- fdct算法 java_ImageSharp源码详解之JPEG压缩原理(3)DCT变换
DCT变换可谓是JPEG编码原理里面数学难度最高的一环,我也是因为DCT变换的算法才对JPEG编码感兴趣(真是不自量力).这一章我就把我对DCT的研究心得体会分享出来,希望各位大神也不吝赐教. 1.离 ...
- zlib源码分析—DEFLATE算法原理及实现
从上一篇博客zlib源码分析-compress函数学习了compress函数的代码,这一篇我们来详细分析一下deflate算法的流程.先从compress代码中所体现出来的deflate函数的返回值和 ...
- PNG 图片压缩原理的两个关键点!
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | airuikun 来源 | https://github.com/airuikun ...
- png图片压缩原理解析
什么是PNG PNG的全称叫便携式网络图型(Portable Network Graphics)是目前最流行的网络传输和展示的图片格式,原因有如下几点: 无损压缩:PNG图片采取了基于LZ77派生算法 ...
- PNG图片压缩原理--屌丝的眼泪 #1
背景 今天凌晨一点,突然有个人加我的qq,一看竟然是十年前被我删掉的初恋.... 因为之前在qq空间有太多的互动,所以qq推荐好友里面经常推荐我俩互相认识....谜之尴尬 同意好友申请以后,仔细看了她 ...
- PNG 图片压缩原理解析
原文地址见文末,感谢原作者. Table of Contents 背景 什么是PNG PNG类型 PNG图片数据结构 PNG的压缩 压缩(Compression) 结语 背景 今天凌晨一点,突然有个人 ...
- deflate算法总结
参考资料: 1.gzip压缩系列 2.ZIP压缩算法详细分析及解压实例解释 3.An Explanation of the Deflate Algorithm 4.RFC1951 1.deflate压 ...
- PNG图片压缩原理解析--屌丝的眼泪
今天看到一篇文章,本以为是技术硬核,却发现是杯情感鸡汤~,转一下. 链接: https://segmentfault.com/a/1190000018557449 背景 今天凌晨一点,突然有个人加我的 ...
最新文章
- C与C++之间相互调用
- MariaDB(MySQL)_MariaDB(Mysql)-主从搭建
- C#控件访问调用它的父级页面
- 要把人工智能提速50倍的ARM,却依然坚持做“通用的计算架构”
- 自动驾驶算法-滤波器系列(四)——不同运动模型在KF/EKF中的应用
- python的setheading什么意思_用Python告诉你什么是佩奇
- Tomcat环境部署以及tomcat多实例搭建(同一台机器)
- JavaScript高级程序设计知识点汇总
- WPF:新手入门教程
- 电视盒子线刷固件教程B860AV2.1-A-M-T版
- Scrum-Sprint关键会议的培训
- 将ipone项目转到ipad平台以及开发同时支持这两个平台的项目
- 一包辣条如何逆袭,从屌丝品牌成为有逼格的产品?
- 小程序顶部自定义标题栏高度自适应
- 此beta版已额满_坚果 Pro 3 发布 Smartisan OS v7.5.0早期众测版
- head first java 最新版_Head First Java.(第2版)
- 使用Tensorflow构建属于自己的图片分类器
- 0基础也能看懂的二维码生成器 API 的技术原理(附Java 接入代码)
- 传统文化中,“七”代表着什么?
- 在linux环境下 com.aspose.words将word文件转图片后乱码,window系统正常
热门文章
- 易语言远程查询oracle数据库连接,易语言如何连接远程服务器上的数据库,并读取数据...
- CXF之jaxws:endpoint对spring bean的引用
- 一键关闭服务器危险端口BAT文件安防篇
- WordPress资源站点推荐
- linux通过操作界面和命令行的方式查看ip地址、mac地址
- window 服务(三)
- python连接sql引用的第三方库_python连接sqlserver数据库操作
- 《FPGA 应用开发入门与典型实例》(修订版)
- Maven——安装(二)
- Arcgis server——arcgis server manager忘记密码