文档章节

霍夫曼编码压缩算法

h
 hujiapeng
发布于 2016/12/28 09:42
字数 693
阅读 2
收藏 0

原址:https://mp.weixin.qq.com/s/PjHuOv8FFHWVn37rKwVTiw

压缩下面的字符串:

    “beep boop beer!”

首先,我们先计算出每个字符出现的次数,我们得到下面这样一张表 :

然后,我把把这些东西放到Priority Queue中(用出现的次数据当 priority),我们可以看到,Priority Queue 是以Prioirry排序一个数组,如果Priority一样,会使用出现的次序排序:下面是我们得到的Priority Queue:

接下来就是我们的算法——把这个Priority Queue 转成二叉树。我们始终从queue的头取两个元素来构造一个二叉树(第一个元素是左结点,第二个是右结点),并把这两个元素的priority相加,并放回Priority中(再次注意,这里的Priority就是字符出现的次数),然后,我们得到下面的数据图表:

同样,我们再把前两个取出来,形成一个Priority为2+2=4的结点,然后再放回Priority Queue中

继续我们的算法(我们可以看到,这是一种自底向上的建树的过程):

 

 

 

最终我们会得到下面这样一棵二叉树:

 

此时,我们把这个树的左支编码为0,右支编码为1,这样我们就可以遍历这棵树得到字符的编码,比如:‘b’的编码是 00,’p’的编码是101, ‘r’的编码是1000。我们可以看到出现频率越多的会越在上层,编码也越短,出现频率越少的就越在下层,编码也越长

最终我们可以得到下面这张编码表:

这里需要注意一点,当我们encode的时候,我们是按“bit”来encode,decode也是通过bit来完成,比如,如果我们有这样的bitset “1011110111″ 那么其解码后就是 “pepe”。所以,我们需要通过这个二叉树建立我们Huffman编码和解码的字典表。

这里需要注意的一点是,我们的Huffman对各个字符的编码是不会冲突的,也就是说,不会存在某一个编码是另一个编码的前缀,不然的话就会大问题了。因为encode后的编码是没有分隔符的。

于是,对于我们的原始字符串  beep boop beer!

其对就能的二进制为 : 0110 0010 0110 0101 0110 0101 0111 0000 0010 0000 0110 0010 0110 1111 0110 1111 0111 0000 0010 0000 0110 0010 0110 0101 0110 0101 0111 0010 0010 0001

(这里说明一下,每个英文字母都有对应的二进制码,如小写的a 是01100001  转换器

我们的Huffman的编码为: 0011 1110 1011 0001 0010 1010 1100 1111 1000 1001

从上面的例子中,我们可以看到被压缩的比例还是很可观的。

 

© 著作权归作者所有

h
粉丝 0
博文 100
码字总数 60569
作品 0
海淀
私信 提问
【工具使用系列】关于 MATLAB 图像编码 & 图像压缩,你需要知道的事情

如何进行图像压缩 图像压缩 统计编码 行程编码 霍夫曼编码 预测编码 预测编码 视频压缩 图像序列和电影 时间冗余和运动补偿 什么是图像压缩 图像编码概述 图像压缩编码的必要性和可能性 图像...

AllenMoore
2018/01/27
4
0
数据压缩----霍夫曼树和霍夫曼压缩

霍夫曼压缩的思想: 使用较少的比特表示出现频繁的字符而使用较多的比特表示使用较少的字符。这样表示字符串所使用的总比特数就会减少。 前提:所有字符编码都不会成为其他字符编码的前缀。使...

SuperHeroes
2018/01/28
0
0
数据压缩算法----游程编码和霍夫曼编码

游程编码 定义: 用一个 符号值/串 代替具有相同值的连续符号(连续符号构成了一段连续的“游程”。游程编码因此而得名),使符号长度少于原始数据的长度。 应用场景: 游程编码经典应用场景...

SuperHeroes
2018/01/28
0
0
数据结构-04-霍夫曼压缩(Huffman Compression)

Huffman Compression - 霍夫曼压缩 主要思想:放弃文本文件的普通保存方式:不再使用7位或8位二进制数表示每一个字符,而是用较少的比特表示出现频率最高的字符,用较多的比特表示出现频率低...

Corwien
2016/06/17
26
0
zip 的压缩原理与实现

http://www.blueidea.com/bbs/newsdetail.asp?id=1819267&page=2&posts=&Daysprune=5&lp=1 无损数据压缩是一件奇妙的事情,想一想,一串任意的数据能够根据一定的规则转换成只有原来 1/2 - ...

晨曦之光
2012/03/09
313
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring系列教程八: Spring实现事务的两种方式

一、 Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。...

我叫小糖主
50分钟前
4
0
CentOS 的基本使用

1. 使用 sudo 命令, 可以以 root 身份执行命令, 必须要在 /etc/sudoers 中定义普通用户 2. 设置 阿里云 yum 镜像, 参考 https://opsx.alibaba.com/mirror # 备份mv /etc/yum.repos.d/CentO...

北漂的我
昨天
2
0
Proxmox VE技巧 移除PVE “没有有效订阅” 的弹窗提示

登陆的时候提示没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options. 用的是免费版的,所以每次都提示......

以谁为师
昨天
3
0
Java设计模式之外观模式(门面模式)

什么是外观模式   外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口...

须臾之余
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部