0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一个经典的压缩算法Huffman算法

jqYd_gh_7579151 来源:未知 作者:李倩 2018-09-05 14:50 次阅读

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

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

“beep boop beer!”

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

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

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

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

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

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

此时,我们把这个树的左支编码为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

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

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

编写代码实现:实现结果与图示结果不一样的原因是次数出现了重复。

代码CSDN下载地址:https://download.csdn.net/download/u013915688/10645042

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4453

    浏览量

    90746
  • Huffman
    +关注

    关注

    0

    文章

    3

    浏览量

    6308

原文标题:霍夫曼压缩编辑算法讲解最清楚的算法

文章出处:【微信号:gh_757915171cb5,微信公众号:FPGA自学笔记】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA实现滑动平均滤波算法和LZW压缩算法

    ,同时也可获得较好的压缩比和压缩速度,具有定实用价值。【关键词】:数据采集;;滑动平均滤波算法;;LZW;;FPGA【DOI】:CNKI:SUN:GWDZ.0.2010-02-029
    发表于 04-24 09:05

    语音压缩算法研究

    希望广大DSP大侠们帮我出出主意,怎么才能写好的音频压缩算法,最好是在时域的压缩。频域的压缩
    发表于 09-18 17:38

    C程序经典算法

    里面有C程序经典算法,可以帮助大家精通C程序,其实单片机到最后也就是算法最重要
    发表于 09-27 22:26

    数组压缩算法

    需求:规定次波形显示的数据时231点。算法要求:采集到的数值是可以确定的。10000点以内的点数都压缩成231
    发表于 06-09 17:35

    经典算法大全(51C语言算法+单片机常用算法+机器学十大算法

    算法的描述:是对要解决问题或要完成项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语
    发表于 10-23 14:31

    【案例分享】经典压缩算法Huffman算法

    前两天发布那个rsync算法后,想看看数据压缩算法,知道经典
    发表于 07-17 04:30

    什么是压缩算法呢?压缩算法又是怎么定义的呢?

    认识压缩算法想必都有过压缩和解压缩文件的经历,当文件太大时,我们会使用文件压缩来降低文件的占用空间。比如微信上传文件的限制是100MB,有
    发表于 07-28 07:22

    认识压缩算法

    压缩算法认识压缩算法我们想必都有过压缩和 解压缩文件的经历,当文件太大时,我们会使用文件
    发表于 07-28 08:12

    什么是压缩算法

    什么是压缩算法呢?压缩算法又是怎么定义的呢?
    发表于 10-19 07:25

    压缩算法是怎么定义的呢

    什么是压缩算法呢?压缩算法又是怎么定义的呢?文件是如何存储的?
    发表于 10-19 07:01

    啃论文俱乐部 | 压缩算法团队:我们是如何开展对压缩算法的学习

    CMA、数据管理、软总线通讯等,由于我对“压缩算法”比较感兴趣,凭着腔奋斗热血的我坚定地选择了压缩算法技术团队并自告奋勇担任了该团队组长
    发表于 06-21 11:05

    C语言经典算法大全

    C语言经典算法,详细解析算法过程及算法思想,给读者具有启发意义,教程包含C语言大部分常用算法,仅供学习,禁止商业传播
    发表于 10-07 08:16

    C语言经典算法

    C语言经典算法--助你解决算法问题C语言经典算法
    发表于 03-23 14:30 27次下载

    基于0阈值的双位图压缩_双Huffman组合压缩算法_许海英

    基于0阈值的双位图压缩_双Huffman组合压缩算法_许海英
    发表于 03-19 11:31 0次下载

    Huffman霍夫曼压缩编码算法实现分析

    哈夫曼编码Huffman方法于1952年问世,迄今为止仍经久不衰,广泛应用于各种数据压缩技术中,且仍不失为熵编码中的最佳编码方法,deflate等压缩算法也是结合了
    发表于 12-01 09:56 6658次阅读