huffman编码的程序流程图_Huffman编码实现压缩解压缩

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

原理介绍

什么是Huffman压缩

Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了,它是一种无损压缩方法,在压缩过程中不会丢失信息熵。并且能够证明 Huffman 算法在无损压缩算法中是最优的。

Huffman 原理简单,实现起来也不困难,在如今的主流压缩软件得到了广泛的应用。

相应用程序、重要资料等绝对不同意信息丢失的压缩场合, Huffman 算法是非常好的选择。

怎么实现Huffman压缩

哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件。哈夫曼压缩属于可变代码长度算法一族。意思是个体符号(比如,文本文件里的字符)用一个特定长度的位序列替代。

因此。在文件里出现频率高的符号,使用短的位序列。而那些非常少出现的符号。则用较长的位序列。

二叉树

在计算机科学中。二叉树是每个结点最多有两个子树的有序树。

通常子树的根被称作 “ 左子树 ” ( left subtree )和 “ 右子树 ” ( right subtree )。

哈夫曼编码 (Huffman Coding)

哈夫曼编码是一种编码方式,哈夫曼编码是可变字长编码 (VLC) 的一种。 uffman 于 1952 年提出一种编码方法。该方法全然依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作 Huffman 编码。

Huffman编码生成步骤

扫描要压缩的文件,对字符出现的频率进行计算。

把字符按出现的频率进行排序,组成一个队列。

把出现频率最低(权值)的两个字符作为叶子节点。它们的权值之和为根节点组成一棵树。

把上面叶子节点的两个字符从队列中移除,并把它们组成的根节点增加到队列。

把队列又一次进行排序。反复步骤 3、4、5 直到队列中仅仅有一个节点为止。

把这棵树上的根节点定义为 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 三个二进制位。

效果显而易见。

编码实现

流程图

编码流程

Created with Raphaël 2.1.0開始读入待压缩文件,计算文件里各字符的权重依据权重构建Huffman树依据Huffman树获得各个字符的HUffman编码,并建立Huffman编码的HashTable将字符总数、字符种

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值