为什么80%的码农都做不了架构师?>>>   

前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法。相信大家应该听说过 David
Huffman 和他的压缩算法—— Huffman Code,一种通过字符出现频率,Priority
Queue,和二叉树来进行的一种压缩算法,这种二叉树又叫Huffman二叉树 ——
一种带权重的树。从学校毕业很长时间的我忘了这个算法,但是网上查了一下,中文社区内好像没有把这个算法说得很清楚的文章,尤其是树的构造,而正好看到一篇国外的文章《A
Simple Example of Huffman Code on a
String》,其中的例子浅显易懂,相当不错,我就转了过来。注意,我没有对此文完全翻译。

我们直接来看示例,如果我们需要来压缩下面的字符串:

“beep
boop beer!”

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

字符 次数
‘b’ 3
‘e’ 4
‘p’ 2
‘ ‘ 2
‘o’ 2
‘r’ 1
‘!’ 1

然后,我把把这些东西放到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。我们可以看到出现频率越多的会越在上层,编码也越短,出现频率越少的就越在下层,编码也越长

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

字符 编码
‘b’ 00
‘e’ 11
‘p’ 101
‘ ‘ 011
‘o’ 010
‘r’ 1000
‘!’ 1001

这里需要注意一点,当我们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

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

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

作者给出了源码你可以看看(
C99标准) Download
the source files

转自 http://coolshell.cn/articles/7459.html

转载于:https://my.oschina.net/jie07/blog/84328

Huffman 编码压缩算法相关推荐

  1. huffman编码压缩算法

    转自:http://coolshell.cn/articles/7459.html 前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过  ...

  2. 数据流压缩原理实现(huffman编码,LZ77压缩算法)

    1. 压缩原理deflate算法 a) LZ77 算法原理 b) Huffman算法原理 c) Huffman算法测试实例 2.  关于zlib库的实际应用以及gzip格式分析查看下一篇 一.数据压缩 ...

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

    这是我们的课程中布置的作业.找一些资料将作业完毕,顺便将其写到博客,以后看起来也方便. 原理介绍 什么是Huffman压缩 Huffman( 哈夫曼 ) 算法在上世纪五十年代初提出来了,它是一种无损压 ...

  4. Huffman编码解压缩的通俗讲解

    前言 好久没写博客了,主要是各种事缠着,难以抽出时间.这两个月以来,由于项目需要,我也逼着自己学到了很多,什么java后台,web前端,还有万恶的OpenCV图形处理--,呵呵,全栈:( .但对And ...

  5. huffman编码译码器用c语言,基于哈弗曼编码的数据压缩C语言实现

    haod 摘要 数据压缩技术是一项重要实用的信息技术.信息时代的到来,信息量迅速增长,使得数据压缩也显得越来越重要.数据压缩有多种编码方法,大致可分为无损压缩编码和有损压缩编码.其中,Huffman ...

  6. 【信息科学技术与创新】数据压缩的理论方法与现实意义 信息论 压缩编码 通信的数学理论 Huffman编码 LZ算法 虚幻引擎与数据压缩

    数据压缩的理论方法与现实意义 摘要 首先通过信息论引出数据压缩编码的理论方法 接着结合目前技术发展分析压缩编码的现实意义 最后总结思考未来通信与存储的压缩方法 Navigator 数据压缩的理论方法与 ...

  7. huffman树和huffman编码

    不知道为什么,我写的代码都是又臭又长. 直接上代码: #include <iostream> #include <cstdarg> using namespace std; c ...

  8. 技术图文:如何利用C#实现Huffman编码?

    背景 Huffman编码 在通信和数据压缩领域具有重要的应用. 在介绍 Huffman 编码具体实现之前,先介绍几个相关的概念. 概念1:树中结点的带权路径长度 – 根结点到该结点的路径长度与该结点权 ...

  9. huffman java_详解Huffman编码算法之Java实现

    Huffman编码介绍 Huffman编码处理的是字符以及字符对应的二进制的编码配对问题,分为编码和解码,目的是压缩字符对应的二进制数据长度.我们知道字符存贮和传输的时候都是二进制的(计算机只认识0/ ...

最新文章

  1. Redis分布式锁的正确实现方式(Java版)
  2. bzoj 2342: 双倍回文 回文自动机
  3. android 搜索文件代码怎么写,android学习笔记(5)-一个搜索文件的APP(2)-搜索功能的实现...
  4. Linux教程:10条秘诀确保Linux桌面安全性
  5. 《Spring5官方文档》新功能(4,3)
  6. 简述Java内存模型的happen before原则
  7. 小米路由器3 变砖 ttl 救砖,刷入padavan
  8. HELIX Design system v4.r3.M0-ISO 1CD
  9. Java语言背景介绍
  10. 什么软件测试卡路里,热量表(计算热量的仪表)_百度百科
  11. 解决laytpl.js模板引擎插件加载模板后无法获取模板中的元素id等内容
  12. Matlab论文插图绘制模板第82期—箭头图(quiver)
  13. 正则表达式验证生日手机号信息
  14. Google I/O:谷歌AR看似不紧不慢,实则暗藏玄机
  15. CentOS6 64位系统安装步骤
  16. 高清架构整洁之道PDF下载
  17. win10右键一直转圈_Windows系统鼠标右键突然一直转圈无法使用
  18. Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You hav
  19. 用科学计算机求arctan,计算器arctan怎么按
  20. # Ubuntu执行sudo apt-get update提示:E: 仓库 “https://mirrors.ustc.edu.cn/ubuntu focal Release” 没有 Release

热门文章

  1. python打破循环_python – 为什么“c.execute(…)”打破循环?
  2. delphi usb 读写_写作论语 | 崔嵘:写我所读——国外整本书阅读中读写结合的理论与实践(上)...
  3. sqlite fts5 编译 xcode other c flags
  4. 指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程
  5. Unity2D游戏开发基础教程1.2 项目、资源和场景
  6. amd860k能装黑苹果吗_黑苹果配置 篇六:黑苹果硬件选购指南之终篇--2019年8月
  7. cad一键标注闭合区域lisp_自从用了这个CAD神器,我下班总比别人早
  8. BENDR for BCI : 多伦多大学研究者提出受BERT启发的深度神经网络学习​海量EEG 数据...
  9. 脑电分析系列[MNE-Python-18]| 生成模拟原始脑电数据
  10. 共空间模式 Common Spatial Pattern(CSP)原理和实战