博客
关于我
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/

    你可能感兴趣的文章
    Oracle11g静默安装dbca,netca报错处理--直接跟换操作系统
    查看>>
    oracle12安装软件后安装数据库,然后需要自己配置监听
    查看>>
    Oracle——08PL/SQL简介,基本程序结构和语句
    查看>>
    Oracle——distinct的用法
    查看>>
    oracle下的OVER(PARTITION BY)函数介绍
    查看>>
    Oracle中DATE数据相减问题
    查看>>
    Oracle中merge into的使用
    查看>>
    oracle中sql查询上月、本月、上周、本周、昨天、今天的数据!
    查看>>
    oracle中sql的case语句运用--根据不同条件去排序!
    查看>>
    Oracle中Transate函数的使用
    查看>>
    oracle中关于日期问题的汇总!
    查看>>
    Oracle中常用的语句
    查看>>
    oracle中新建用户和赋予权限
    查看>>
    Oracle中的NVL,NVL2,NULLIF以及COALESCE函数使用
    查看>>
    Oracle中的rownum 和rowid的用法和区别
    查看>>
    oracle中的大小写、字符、dual、数字、处理、日期、函数、显/隐式、时间、条件表达式case、decode、to_date、to_char、sysdate
    查看>>
    oracle典型安装失败,安装oracle 10失败
    查看>>
    Oracle分析函数之LEAD和LAG
    查看>>
    Oracle和SQL server的数据类型比较
    查看>>
    Oracle用游标删除重复数据
    查看>>