目录

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 算法相关推荐

  1. 数据流压缩原理实现(huffman编码,LZ77压缩算法)

    1. 压缩原理deflate算法 a) LZ77 算法原理 b) Huffman算法原理 c) Huffman算法测试实例 2.  关于zlib库的实际应用以及gzip格式分析查看下一篇 一.数据压缩 ...

  2. fdct算法 java_ImageSharp源码详解之JPEG压缩原理(3)DCT变换

    DCT变换可谓是JPEG编码原理里面数学难度最高的一环,我也是因为DCT变换的算法才对JPEG编码感兴趣(真是不自量力).这一章我就把我对DCT的研究心得体会分享出来,希望各位大神也不吝赐教. 1.离 ...

  3. zlib源码分析—DEFLATE算法原理及实现

    从上一篇博客zlib源码分析-compress函数学习了compress函数的代码,这一篇我们来详细分析一下deflate算法的流程.先从compress代码中所体现出来的deflate函数的返回值和 ...

  4. PNG 图片压缩原理的两个关键点!

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | airuikun 来源 | https://github.com/airuikun ...

  5. png图片压缩原理解析

    什么是PNG PNG的全称叫便携式网络图型(Portable Network Graphics)是目前最流行的网络传输和展示的图片格式,原因有如下几点: 无损压缩:PNG图片采取了基于LZ77派生算法 ...

  6. PNG图片压缩原理--屌丝的眼泪 #1

    背景 今天凌晨一点,突然有个人加我的qq,一看竟然是十年前被我删掉的初恋.... 因为之前在qq空间有太多的互动,所以qq推荐好友里面经常推荐我俩互相认识....谜之尴尬 同意好友申请以后,仔细看了她 ...

  7. PNG 图片压缩原理解析

    原文地址见文末,感谢原作者. Table of Contents 背景 什么是PNG PNG类型 PNG图片数据结构 PNG的压缩 压缩(Compression) 结语 背景 今天凌晨一点,突然有个人 ...

  8. deflate算法总结

    参考资料: 1.gzip压缩系列 2.ZIP压缩算法详细分析及解压实例解释 3.An Explanation of the Deflate Algorithm 4.RFC1951 1.deflate压 ...

  9. PNG图片压缩原理解析--屌丝的眼泪

    今天看到一篇文章,本以为是技术硬核,却发现是杯情感鸡汤~,转一下. 链接: https://segmentfault.com/a/1190000018557449 背景 今天凌晨一点,突然有个人加我的 ...

最新文章

  1. C与C++之间相互调用
  2. MariaDB(MySQL)_MariaDB(Mysql)-主从搭建
  3. C#控件访问调用它的父级页面
  4. 要把人工智能提速50倍的ARM,却依然坚持做“通用的计算架构”
  5. 自动驾驶算法-滤波器系列(四)——不同运动模型在KF/EKF中的应用
  6. python的setheading什么意思_用Python告诉你什么是佩奇
  7. Tomcat环境部署以及tomcat多实例搭建(同一台机器)
  8. JavaScript高级程序设计知识点汇总
  9. WPF:新手入门教程
  10. 电视盒子线刷固件教程B860AV2.1-A-M-T版
  11. Scrum-Sprint关键会议的培训
  12. 将ipone项目转到ipad平台以及开发同时支持这两个平台的项目
  13. 一包辣条如何逆袭,从屌丝品牌成为有逼格的产品?
  14. 小程序顶部自定义标题栏高度自适应
  15. 此beta版已额满_坚果 Pro 3 发布 Smartisan OS v7.5.0早期众测版
  16. head first java 最新版_Head First Java.(第2版)
  17. 使用Tensorflow构建属于自己的图片分类器
  18. 0基础也能看懂的二维码生成器 API 的技术原理(附Java 接入代码)
  19. 传统文化中,“七”代表着什么?
  20. 在linux环境下 com.aspose.words将word文件转图片后乱码,window系统正常

热门文章

  1. 易语言远程查询oracle数据库连接,易语言如何连接远程服务器上的数据库,并读取数据...
  2. CXF之jaxws:endpoint对spring bean的引用
  3. 一键关闭服务器危险端口BAT文件安防篇
  4. WordPress资源站点推荐
  5. linux通过操作界面和命令行的方式查看ip地址、mac地址
  6. window 服务(三)
  7. python连接sql引用的第三方库_python连接sqlserver数据库操作
  8. 《FPGA 应用开发入门与典型实例》(修订版)
  9. Maven——安装(二)
  10. Arcgis server——arcgis server manager忘记密码