Huffman编码实现压缩解压缩

Posted R-Pursue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Huffman编码实现压缩解压缩相关的知识,希望对你有一定的参考价值。

这是我们的课程中布置的作业,找一些资料将作业完成,顺便将其写到博客,以后看起来也方便。

原理介绍

  • 什么是Huffman压缩

    Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了,它是一种无损压缩方法,在压缩过程中不会丢失信息熵,而且可以证明 Huffman 算法在无损压缩算法中是最优的。 Huffman 原理简单,实现起来也不困难,在现在的主流压缩软件得到了广泛的应用。对应用程序、重要资料等绝对不允许信息丢失的压缩场合, Huffman 算法是非常好的选择。

  • 怎么实现Huffman压缩
    哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件。哈夫曼压缩属于可变代码长度算法一族。意思是个体符号(例如,文本文件中的字符)用一个特定长度的位序列替代。因此,在文件中出现频率高的符号,使用短的位序列,而那些很少出现的符号,则用较长的位序列。

    1. 二叉树
      在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作 “ 左子树 ” ( left subtree )和 “ 右子树 ” ( right subtree )。
      二叉树
    2. 哈夫曼编码 (Huffman Coding)
      哈夫曼编码是一种编码方式,哈夫曼编码是可变字长编码 (VLC) 的一种。 uffman 于 1952 年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作 Huffman 编码。
  • Huffman编码生成步骤
    1. 扫描要压缩的文件,对字符出现的频率进行计算。
    2. 把字符按出现的频率进行排序,组成一个队列。
    3. 把出现频率最低(权值)的两个字符作为叶子节点,它们的权值之和为根节点组成一棵树。
    4. 把上面叶子节点的两个字符从队列中移除,并把它们组成的根节点加入到队列。
    5. 把队列重新进行排序。重复步骤 3、4、5 直到队列中只有一个节点为止。
    6. 把这棵树上的根节点定义为 0 (可自行定义 0 或 1 )左边为 0 ,右边为 1 。这样就可以得到每个叶子节点的哈夫曼编码了。
      这里写图片描述
      如 (a) 、 (b) 、 (c) 、 (d) 几个图,就可以将离散型的数据转化为树型的了。
      如果假设树的左边用0 表示右边用 1 表示,则每一个数可以用一个 01 串表示出来。
      这里写图片描述
      则可以得到对应的编码如下:
      1–>110
      2–>111
      3–>10
      4–>0
      每一个01 串,既为每一个数字的哈弗曼编码。
  • 为什么能压缩
    压缩的时候当我们遇到了文本中的1 、 2 、 3 、 4 几个字符的时候,我们不用原来的存储,而是转化为用它们的 01 串来存储不久是能减小了空间占用了吗。(什么 01 串不是比原来的字符还多了吗?怎么减少?)大家应该知道的,计算机中我们存储一个 int 型数据的时候一般式占用了 2^32-1 个 01 位,因为计算机中所有的数据都是最后转化为二进制位去存储的。所以,想想我们的编码不就是只含有 0 和 1 嘛,因此我们就直接将编码按照计算机的存储规则用位的方法写入进去就能实现压缩了。
    比如:
    1这个数字,用整数写进计算机硬盘去存储,占用了 2^32-1 个二进制位
    而如果用它的哈弗曼编码去存储,只有110 三个二进制位。
    效果显而易见。

编码实现

  1. 流程图
    编码流程
Created with Raphaël 2.1.0 开始 读入待压缩文件,计算文件中各字符的权重 根据权重构建Huffman树 根据Huffman树获得各个字符的HUffman编码, 并建立Huffman编码的HashTable 将字符总数、字符种数, 以及Huffman树写入压缩文件文件头 再次读入待压缩文件, 根据其内容和coding hash table 将压缩后的数据写入文件 结束

以上是关于Huffman编码实现压缩解压缩的主要内容,如果未能解决你的问题,请参考以下文章

Huffman编码实现压缩解压缩

Huffman的应用之文件压缩与解压缩

Huffman的应用之文件压缩与解压缩

基于DCT+huffman变换的图像压缩解压缩FPGA实现

Huffman编码解压缩的通俗讲解

[保姆级万字教程]打造最迷人的S曲线----带你从零手撕基于Huffman编码的文件压缩项目