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

前两天发布那个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

huffman编码压缩算法相关推荐

  1. Huffman 编码压缩算法

    为什么80%的码农都做不了架构师?>>>    前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huf ...

  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. Java性能调优实践
  2. Xamarin支持微软HoloLens混合现实开发
  3. 表面粗糙度的基本评定参数是_表面粗糙度100问,讲得明明白白
  4. 并发服务器模型——多进程服务器
  5. eclipse设置工作空间编码为默认utf-8
  6. 救护车电源逆变器行业调研报告 - 市场现状分析与发展前景预测
  7. 面向.Net程序员的Sql版本管理
  8. 圣经 英文有声 android,英文有声+Epub Foundation Series 7部 Isaac Asimov - Audiobook
  9. mybatis mysql like 传参问题_记一次使用mybatis进行like 模糊查询遇到的问题
  10. 数据库分页的几种实现
  11. 学校管理系统服务器,校园信息管理系统(MIS)
  12. 实践对比google和bing搜索哪个更优
  13. Codeforces Round #614 (Div. 2)A. ConneR and the A.R.C. Markland-N
  14. 《跟小智一起学网络》教程目录
  15. 用计算机研究脑电波,超现实主义 用脑电波控制计算机设备
  16. 装修后才知道的79件事,无数网友真金白银砸出来...
  17. 伤害世界怎么自建服务器,伤害世界服务器架设图文教程
  18. 第一节计算机课开场白,第一节课有趣的开场白
  19. 为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz?
  20. 设计模式---状态模式(State Pattern)

热门文章

  1. 二、HDFS基本架构和shell操作
  2. 七十一、Springboot整合MyBatis(注解版)
  3. CIKM 2021 | Deep Retrieval:字节跳动深度召回模型论文精读
  4. NeurlPS 2021论文预讲会议题全公开,4大主题和25场报告等你来
  5. 博士申请 | 上海交通大学叶南阳助理教授招收机器学习方向博士生
  6. 预习-上课-复习:让机器像人一样学习对话
  7. SIGIR 2021|重新思考Attention在CTR预估中作用
  8. 半监督学习之数据加载
  9. python定义类object_Python之ClassObject用法详解
  10. LeetCode 23 合并K个升序链表