1、哈夫曼编码(Huffman Coding),又称霍夫曼编码,是Huffman于1952年提出的一种编码方式,可变字长编码(VLC)的一种。霍夫曼编码不仅会考察文本中有多少个不同字符,还会考察每个字符出现的频率,根据频率的不同,选择不同长度的编码。霍夫曼编码试图用这种不等长的编码方法,来进一步增加压缩的效率,广泛用于数据压缩中,其压缩率通常在 20%~90% 之间。有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

2、举例说明:
假设我有一个包含 1000 个字符的文件,每个字符占 1 个 byte(1byte=8bits),那存储这 1000 个字符就一共需要 8000bits。假设我们通过统计分析发现,这 1000 个字符中只包含 6 种不同字符,假设它们分别是 a、b、c、d、e、f。为了尽量减少存储空间,每个字符我们用 3 个二进制位(3bit)来表示:a(000)、b(001)、c(010)、d(011)、e(100)、f(101)【注:因为3 个二进制位(bit)就可以表示 8 个不同的字符】,那现在每个字符只需要3bit,存储这 1000 个字符只需要3*1000= 3000bits 就可以了,比原来的存储方式节省了5000bits空间。在解压缩的时候,我们每次从文本中读取 3 位二进制码,然后翻译成对应的字符即可。

但是,霍夫曼编码是不等长的!每次应该读取 1 位还是 2 位、3 位等等来解压缩呢?所以为了避免解压缩过程中的歧义,霍夫曼编码要求各个字符的编码之间,不会出现某个编码是另一个编码前缀的情况。 在解压缩的时候,我们每次会读取尽可能长的可解压的二进制串,所以在解压缩的时候也不会歧义。

假设这 6 个字符出现的频率从高到低依次是 a、b、c、d、e、f,我们把它们编码下面这个样子,经过这种(霍夫曼)编码压缩之后,这 1000 个字符只需要 2100bits 就可以了。

3、解释上边提及的,如何进行霍夫曼编码呢?
那如何给不同的字符进行不同长度的编码呢?简易的理解就是,根据出现的频率(即权值)放进优先队列,那么我们第一步先取两个最小权值作为左右子树构造一个新树,即取e,f构成新树,其父结点为x(50),然后再重复操作,取出x.d,构造父节点为y,以此类推,最后根节点权值为1000(字符串出现总数,即总频率)如图:

指向左子节点的边权值我们统统标记为 0,指向右子节点的边,权值我们统统标记为 1,那从根节点到叶节点的路径就是叶节点对应字符的霍夫曼编码。

4、小结: 根据例子我们看出原本1000 个字符的文件,普通字符存储需要8000bits,通过二进制位等长编码优化完,存储需要3000bits,进一步通过霍夫曼编码优化,需要2100bits 就可以了!

哈夫曼编码的理解(Huffman Coding)相关推荐

  1. 哈夫曼编码的理解以及简单实现

    哈夫曼树 在介绍哈夫曼编码前,我们先来了解一下哈夫曼树. 美国科学家哈夫曼在1952年发现了哈夫曼编码,为了纪念他的成就,于是把他在编码中用到的特殊二叉树称之为哈夫曼树,这种编码方法称之为哈夫曼编码. ...

  2. 信息论霍夫曼编码c语言,Huffman 信息论与编码 - 下载 - 搜珍网

    霍夫曼编码/Shiyan4/Shiyan.sln 霍夫曼编码/Shiyan4/Shiyan.suo 霍夫曼编码/Shiyan4/Shiyan.v11.suo 霍夫曼编码/Shiyan4/Shiyan4 ...

  3. 霍夫曼算法_霍夫曼编码算法

    霍夫曼算法 In this tutorial, we'll be discussing and implementing the Huffman Coding Algorithm in Java. 在 ...

  4. 2022黄文嵩商盛兰张阳徐铭信息论课程作业 哈夫曼编码(Huffman Coding)简介

    目录 5G,华为,土耳其--我花了两个月,搞懂了5G背后的秘密_哔哩哔哩_bilibili 一.什么是编码? 二.哈夫曼编码 1.编码过程 2.码方差 3.编码特点 4.人无完人,码无完码 三.总结 ...

  5. C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码

    David A. Huffman 哈夫曼编码简史(Huffman code) 1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试.导师Robert M. Fano给他们的学期 ...

  6. 二进制哈夫曼编码c语言实现,二进制霍夫曼编码

    通过查看其他博客的内容,整理一篇关于二进制霍夫曼编码的笔记供大家参考和讨论,如果有错误,欢迎大家联系我批评指正. 一.二进制霍夫曼的原理 我们可以将二进制霍夫曼编码拆分理解: 二进制即 0.1: 二进 ...

  7. 信息论霍夫曼编码c语言,霍夫曼编码

    <信息论与编码>课程实验报告 姓 名 学 号 单 位 专 业 2014 年 12 月 4 日 实验一 一.实验目的 1.理解信源编码的意义: 2.掌握霍夫曼编码的方法及计算机实现: 二.实 ...

  8. 哈夫曼编码(Huffman Coding)

    霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...

  9. 霍夫曼编码(huffman coding) (java实现)

    文章目录 一.浅谈赫夫曼编码 二.获取赫夫曼编码 1.获取字符出现的次数 2.创建赫夫曼树 3.指定编码 三.代码实现 1.指定编码代码 2.完整代码 总结 提示:以下是本篇文章正文内容,下面案例可供 ...

  10. 霍夫曼编码(Huffman Coding)

    霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...

最新文章

  1. chrome使用技巧(看了定不让你失望)
  2. MVC之前的那点事儿系列(2):HttpRuntime详解分析(上)
  3. 现实世界的Windows Azure:采访圣地亚哥公共安全小组的技术经理Adrian Gonzalez
  4. [原创]基于frida的脱壳工具
  5. C++中数字和字符的转换
  6. es6 作为对象属性的Generator函数
  7. python邮件发送_Python实现邮件发送
  8. python中的运算符重载_Python中的操作符重载
  9. 2007年测试员的工具选择排名
  10. 土地利用转移矩阵图怎么做_如何用Arcgis做土地利用转移矩阵?求教各位..._土地估价师_帮考网...
  11. 刻录光驱只能读不能写怎么办?来看看!
  12. N1完美刷入Armbian系统
  13. 中英对照泰戈尔《飞鸟集》(一)
  14. Borland 26年风雨路
  15. uni-app学习路线与建议
  16. 广东省如何办理甲级测绘资质
  17. Photoshop CC 2019快速选择工具的抠图
  18. 服务器微信了早上好,早上好微信问候语(精选50句)
  19. 耦合协调度指标如何分析?
  20. Mybatis——主子表查询的Mapper

热门文章

  1. 最小二乘支持向量回归Matlab实现
  2. 矩阵求导法则与性质,机器学习必备~
  3. Android EditText 属性汇总
  4. DXGI 方式采集流程
  5. python写出租车计费系统_用VHDL设计出租车计费系统
  6. 利用运动学实现导弹仿真飞行
  7. 腾讯云短信设置流程图文介绍
  8. UE4 蓝图通信:接口调用
  9. 网件刷breed_小白爱折腾 篇二:矿渣小娱C1刷breed以安装固件(适用其他路由器)...
  10. 装机 --- Windows无法安装到这个磁盘,选中的磁盘具有MBR分区表。在EFI系统上,Windows只能安装到GPT磁盘