博客
关于我
deflate算法总结
阅读量:364 次
发布时间:2019-03-04

本文共 1582 字,大约阅读时间需要 5 分钟。

Deflate是一种广泛应用于数据压缩的无损压缩算法,其核心原理结合了LZ77算法和Huffman编码,能够有效压缩文本文件、图片等数据。以下将从LZ77算法、Huffman编码以及Deflate数据格式等方面详细阐述其工作原理和实现方式。

LZ77算法

LZ77算法的核心思想是利用数据中常见的重复子串特性进行压缩。具体过程如下:

  • 滑动窗口机制:LZ77算法采用了滑动窗口机制,窗口大小通常为32KB。压缩过程中,会从当前窗口中查找当前字符序列是否存在于窗口中,如果存在,则记录该字符序列在窗口中的起始位置(distance)和字符长度(length)。

  • 三种输出数据:LZ77算法的输出数据包括:

    • Literal(未匹配字符):指未与前文重复的字符序列。
    • Distance(距离编码):表示当前字符序列在滑动窗口中的起始位置偏移。
    • Length(长度编码):表示当前字符序列的长度。
  • 优化与适用场景:LZ77算法的滑动窗口大小可以根据需要进行调整,窗口大小越大,重复子串查找的可能性越高,但同时也会增加算法的时间复杂度。因此,在实际应用中需要根据压缩效率与时间复杂度进行权衡。

  • Huffman编码

    Huffman编码是一种将频繁出现的字符用较短的码字表示的前缀编码方式。其核心原理如下:

  • 构建Huffman树:根据字符频率统计,构建一颗二叉树,叶子节点代表字符,内部节点代表分割字符的逻辑结构。字符频率高的节点越靠近根部,赋值较短。

  • 编码过程:从树的叶子节点开始,沿着路径生成对应的二进制码字,直到根部为止。例如,对于字符频率分别为3、6、4、3、4、3、4、3、5、6的数据,Huffman树将生成如下码字:

    • 3 → 0
    • 6 → 10
    • 4 → 110
    • 5 → 111
  • 优化Deflate树:Deflate在Huffman树的基础上增加了一些优化,例如:

    • 树的左右分支可以互换,不影响编码结果。
    • 使用最不平衡的树结构(Deflate树)进行压缩。
  • Deflate数据格式

    Deflate压缩后的数据格式包含以下几个部分:

  • Header

    • BFINAL:3位,表示是否为最后一个数据块。
    • 压缩方式选择:2位,用于标识是否使用Huffman编码。
    • HLIT:5位,表示Literal/Length码表中的码长个数。
    • HDIST:5位,表示Distance码表中的码长个数。
    • HCLEN:4位,表示Huffman码表3(用于压缩码长和距离码长)中的码长个数。
  • Code表

    • CL1(Literal/Length码长序列):通过HLIT+257个CL1。
    • CL2(Distance码长序列):通过HDIST+1个CL2。
    • CCL(Huffman码表3):通过HCLEN+4个CCL。
  • 压缩数据

    • LIT比特流:通过Huffman码表1解码后的Literal/Length数据。
    • DIST比特流:通过Huffman码表2解码后的Distance数据。
  • 结束标志:256(结束标志)。

  • 代码表压缩

    在Deflate压缩中,除了对原始数据进行LZ77和Huffman编码外,还需要对生成的多个码表(如CL1、CL2、CCL)进行进一步的游程编码和Huffman编码:

  • 游程编码:对连续相同的码长值进行压缩,例如16表示重复出现的码长值,后面跟着2位比特表示具体的长度。

  • Huffman编码:对游程编码后的序列再次进行Huffman编码,进一步减少数据量。

  • 总结

    Deflate压缩算法通过结合LZ77算法和Huffman编码,实现了数据的高效压缩。其核心思想是通过滑动窗口查找重复子串(LZ77)和对码表数据进行高效编码(Huffman编码),从而显著降低数据存储需求。Deflate数据格式则为压缩后的数据提供了一个标准化的存储方式,使得压缩和解压过程能够高效且无缝连接。

    转载地址:http://prtq.baihongyu.com/

    你可能感兴趣的文章
    NS图绘制工具推荐
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>
    NT symbols are incorrect, please fix symbols
    查看>>
    ntelliJ IDEA 报错:找不到包或者找不到符号
    查看>>
    NTFS文件权限管理实战
    查看>>
    ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    ntp server 用法小结
    查看>>
    ntpdate 通过外网同步时间
    查看>>
    ntpdate同步配置文件调整详解
    查看>>
    NTPD使用/etc/ntp.conf配置时钟同步详解
    查看>>
    NTP及Chrony时间同步服务设置
    查看>>
    NTP服务器
    查看>>
    NTP配置
    查看>>
    NUC1077 Humble Numbers【数学计算+打表】
    查看>>
    NuGet Gallery 开源项目快速入门指南
    查看>>
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>
    nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
    查看>>
    Nuget~管理自己的包包
    查看>>
    NuGet学习笔记001---了解使用NuGet给net快速获取引用
    查看>>