【项目】HuffMan编码--文件压缩

HuffManTree,又称为最优二叉树,是加权路径最短的二叉树。

使用贪心算法来构建哈夫曼树。贪心算法:是指在问题求解时,总是做出当前看起来最好的选择。也就是说贪心算法做出的不是整体最优解,而是某种意义上的局部最优解。贪心算法不是对所有的问题都能得到最优解。

如下图哈夫曼树我们来分析下文件压缩的原理:





如图的哈夫曼树,我们将叶节点作为每个字符出现的次数,分析树可得,出现次数多的靠近跟节点,出现次数少的远离根节点,那么是为什么呢?请继续往下看,



如图的哈夫曼树,我们将叶节点作为每个字符出现的次数,分析树可得,出现次数多的靠近跟节点,出现次数少的远离根节点,那么是为什么呢?请继续往下看,

因为我们最终的压缩文件是存放的是huffman编码---就是所谓的字符对应的01字符串。所以。为了实现压缩的功能,我们必须让出现字符多的,其haffman编码尽量短,这样才能达到
文件压缩的原理,每个权值都存放在叶节点,这里的权值我们设置的是charinfo类型的参数,主要是字符出现的次数。 权值越大的将距离根节点近,权重值越小的距离根节点远。也就是说字符出现的次数越多,我们让他的哈夫曼编码越短。然后每个字符对应的哈夫曼编码以位的形式存放,本来一个字符是八位,现在可能到不了八位,这样就实现了文件的压缩。若上图右边所示。
下面我们再来看看这个项目的整体架构(说的有点高大上):



如图的哈夫曼树,我们将叶节点作为每个字符出现的次数,分析树可得,出现次数多的靠近跟节点,出现次数少的远离根节点,那么是为什么呢?请继续往下看,

这里的配置文件尤为重要,必不可少。当我们解压一个文件时,是直接根据它的压缩文件解压,所以我们只能得到一个.huffman文件,它里面只是些01编码,我们无法得知字符总次数,因为我们可能在编码后面进行了补位0操作,而我们将这些不属于的0 进行了解压操作,导致文件解压后内容出错。故我们写一些配置文件,来记录总字符次数,还有每个字符出现的次数。然后我们还可以根据这些字符重建二叉树,来进行解码操作。因此配置文件是必不可少的。(这里可能说的有点啰嗦,有问题的可以参考源码进行分析,源码在下面)。



InPut为欲压缩文件,
InPut.con配置文件,
InPut.HuffMan压缩文件,
InPut.uncomp解压文件。
依靠图可以看出将一个9M的文件可以压缩至5M,压缩比56%。

InPut.con配置文件主要记录的内容如下:第一行为字符总数,其他行格式为:字符,次数



如图的哈夫曼树,我们将叶节点作为每个字符出现的次数,分析树可得,出现次数多的靠近跟节点,出现次数少的远离根节点,那么是为什么呢?请继续往下看,

这就是文件压缩项目的有关内容,需要具体代码的戳 
如果大神们有什么好的建议可以进行优化,还望赐教,谢谢!

如图的哈夫曼树,我们将叶节点作为每个字符出现的次数,分析树可得,出现次数多的靠近跟节点,出现次数少的远离根节点,那么是为什么呢?请继续往下看,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值