huffman 压缩

一、huffman二叉树原理

1、将数组按每个数值的权重大小,最小两个权重的数值合并组成一个二叉树,新的二叉树节点值取代原有的两个数值,成为数组的新值,并具有新的权重(原权重相加);

2、新的数组继续取最小权重形成新的二叉树,取代原两数,形成新数组,以此不断循环,直至数组合并成一个值,并形成一个二叉数"森林"——即以最后一个数为根,每层分叉形成两叉;

3、每个数值根据二叉树路径(0,1)形成二进制的huffman编码,并取代原数值。

二、huffman二叉树在文件压缩中的应用

1、文件的每个字节就是数组的每个数值,数值的权重由数值出现的次数取代;

2、每次分叉用1个bit表示,值为0或1。

3、每层一个bit,n层就n个bit,出现次数最多(权重最大的)最靠近根部,也就是用两个bit,出现次数越少,越远离根部,需要更多bits表示。

4、原理用8bits表示的字节,由于靠近根部,可能用2个bits表示,每个字节少6个bits,加上此类字节是文件出现次数最多的字节,节约的bits就会相当可观;虽然远离根部的字节需要较多的bits表示,甚至可能多过8bits,而其出现次数少,增加bits较前面出现频率高的字节减少的字节相比就少得可怜!

以“today,is,a,good,day”(为直观用‘,’代替空格)为例解释huffman压缩。

(1)形成字节数组及其权重

字节数组today ,isg
权重(出现频率)132224111

(2)生成二叉树

(3)形成huffman编码。

字节数组today ,isg
huffman编码000010001001110111000100100011

(4)用编码代替原字符

today,is,a,good,day
111010011011111100100110000111110011011001101001111001110110011000011011001100111110111111011111100100101100110010011000011111001
000010001001110111000100101101111001110010001011010011101

压缩前152bits,压缩后51bits,压缩比33.5%。

三、huffman解压

huffman编码存在不包含“前缀”特性,即n个bits的编码的前(n-1)位绝对不存在编码表中!!!如上表中由于有编码‘0000’,故不会存在‘0’,‘00’,‘000’等编码。有‘100’,绝不存在‘10’。

解压利用这特性,先取两位bits,看是否匹配编码表,不匹配,就取3位,直至匹配;接着循环取,直到结束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值