GZIP学习心得.pdf

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
GZIP学习心得

1 gzip 所使用压缩算法的基本原理 gzip 使用LZ77 算法和Huffman 编码进行压缩。 1.1 LZ77 算法简介 1.1.1 LZ77 算法的压缩原理 如果文件中有两块内容相同的话,那么只要知道前一块的相对位置和大小,我们就可以确定后一块的内容。所以我们可以用 (两者之间的距离(即前向便宜),相同内容的长度 (即复制长度))这样一对信息,来替换后一块内容。 1.1.2 LZ77 使用滑动窗口寻找匹配串 LZ77 算法使用滑动窗口 的方法:用当前处理字节开始的串,和窗口中的每个串进行匹配,寻找最长的匹配串。窗口中的每 个串指,窗口中每个字节开始的串。使用滑动窗口,可以避免每次从第一个字节开始匹配,加快压缩速度,如果快压,则使用 最小的窗口大小即可。 1.1.3 使用LZ77 算法进行压缩和解压缩 为了在解压缩时,可以区分“没有匹配的字节”和“ (之间的距离,匹配长度)对”,需要用0 表示“没有匹配的字节”,用1 表示 “ (之间的距离,匹配长度)对”。 实际中,由于要固定“之间的距离”所使用的位数,所以使用了固定大小的窗口,例如:窗口的大小为32KB,那么用15 位 (2^15=32K )就可以保存所有可能的之间的距离。而当滑动窗口固定之后,最长的匹配长度也固定了,为32K,使用15 位即 可保存所有匹配长度。 最小匹配长度为:1 位+之间的距离表示位数+匹配长度表示位数。例如上述15 滑动窗口的最小匹配长度为31 位。 1.2 Huffman 编码简介 1.2.1 Huffman 编码的压缩原理 列出一定位长内的所有可能数值,例如一个字节可以表示成256 个值。根据这些值在文件中出现的频率,建立编码表。 1.2.2 Huffman 编码使用Huffman 树来产生编码 建立Huffman 树:每次从所有树中找出值最小 (频率最低)的两个节点,为这两个节点建立一个父结点,然后这两个节点 和它们的父结点组成一个新的节点,这个新的节点的值为它的两个子节点的值的和。如果反复,直至只存在一个节点。 通过Huffman 树得到Huffman 编码:在 Huffman 树的所有父结点到它的左子结点的路径上标上0,右子结点的路径上标 上1。 huffman 编码为根节点-叶子节点的路径编码值。 1.2.3 使用Huffman 编码进行压缩和解压缩 压缩: 读文件,统计每个符号的出现次数。根据每个符号的出现次数,建立Huffman 树,得到每个符号的Huffman 编码。将每个符 号的出现次数的信息保存在压缩文件中,将文件中的每个符号替换成它的Huffman 编码,并输出。 解压缩: 得到保存在压缩文件中的,每个符号的出现次数的信息。根据每个符号的出现次数,建立Huffman 树,得到每个符号的 Huffman 编码。将压缩文件中的每个Huffman 编码替换成它对应的符号,并输出。 2 gzip 所使用压缩算法的实现 2.1 寻找匹配串的实现 gzip 在寻找匹配串的实现中使用哈希表来提高速度。 在 gzip 中,最小匹配长度为3,最大匹配长度为258 。 在gzip 中,有三个关键的数据:head[],ins_h,prev[]。说明:字节的hash 值为当前字节及其下两个字节所计算得到的 hash 值。其中: ins_h:字节索引为strstart 的hash 值。 head:数组的下标和ins_h 值对应,数组的值为距离strstart 最近的那个ins_h 值与其相同的字节的索引。 prev:数组的下标和字节的索引对应,下标为strstart_1 的值为距离strstart_1 最近的那个ins_h 值与其相同的字节的索 引。 使用head 和prev 可以构成一个链表,链表头尾为head[ins_h],链表下一个为prev[head[ins_h]],下一个为 prev[prev[head[ins_h]]],依次类推,直至prev[…head[ins_h]]=0。在该链表中的所有节点的字节 hash 值相同,链表头的值最 大,然后接下来的值越来越小,因为这些值带表相同字节hash 值得字节的索引,越考前,索引越大,离第一个字符越远。需 要注意的是,相同的三个字节,hash 值必定相同,但是hash 相同,三个字节不一定相同,因此前三个字节相同的串,必然在 同一个链上;在同一个链上的,不一定前三个字节都相同。 由于进行字节hash 值匹配时,根据head[ins_h]中值是否为0 进行判断,而head[ins_h]的值还有一层意思为最近hash 值 为in

您可能关注的文档

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档