哈夫曼编码
哈夫曼编码,又称为霍夫曼编码,它是现代压缩算法的基础。假如我们需要将字符串ABBBCCCCCCCCDDDDDDEE通过二进制编码进行传输,那应该怎么将字符转换为二进制码?

方法一:转换为ASCII码
直接将字母转换为对应的ASCII码数字,再将ASCII码转换为对应的二进制码

字母 ASCII码 二进制码
A 65 100 0001
B 66 100 0010
C 67 100 0011
D 68 100 0100
E 69 100 0101
显然这样的方式使得二进制码变得很长。

方法二:事先约定5个字母对应的二进制码
字母 ASCII码 二进制码
A 0 0
B 1 1
C 2 10
D 3 11
E 4 100
此时ABBBCC的二进制编码为:01111010,但是我们并不能对其进行解码,这是因为:对于二进制码的第一位0,我们可以立刻判断出是字母A,但对于之后的1111,可以解码为BBBB,也可以解码为DD,也可以…,在此无法进行解码的原因是:存在某个字母的编码是其他字母的前缀,甚至有字母的编码是由其他字母的编码组成。

字母 ASCII码 二进制码
A 0 000
B 1 001
C 2 010
D 3 011
E 4 100
对此我们可以约定每三个二进制位代表一个字母,那么就不存在编码的前缀关系了,解码的问题也可以顺利解决。原字符串的二进制编码为:000001001001010010010010010010010010011011011011011011100100,可以预见的是,方法二的编码一定比方法一短了很多。

方法三:哈夫曼编码
如果使用哈夫曼编码,该字符串可以压缩至41个二进制位,约为原来长度的68.3%。
在构建哈夫曼编码时,我们首先要统计字符串中每个字母的出现频率(这是为了将短的二进制码分配给频率高的字母,以达到缩短二进制码长度的目的),在这里直接通过出现次数进行比较。

A B C D E
1 3 8 6 2
利用这些权值,我们就可以构建一棵哈夫曼树(又称为霍夫曼树、最优二叉树)。

构建哈夫曼树
假设我们有n个不同的字母,对应n个权值。

1、构建n棵只有根节点的二叉树构成森林,根节点的值为n个字母与权值

2、 在森林里选出两棵根节点值最小的树进行合并,合并方式为生成一棵新树,根节点值为两棵树根节点值权值之和,且让两棵树作为新树的左右子树。将两棵树从森林删除,新树加入森林。

3、. 重复 2 的操作,直到森林只剩一棵树为止,该树即为哈夫曼树


构建哈夫曼编码
此时哈夫曼树构建完成了,下面我们要对各个字母进行编码,编码原则是,从哈夫曼树的根节点开始,进入左子树则编码号加0,进入右子树则编码号加1,就可以得到对应字母的二进制编码。

各个字母的编码如下:

A B C D E
1110 110 0 10 1111
此时字符串:ABBBCCCCCCCCDDDDDDEE的哈夫曼编码是1110110110110000000001010101010101111,显然比方法二中的编码短了。

总结
那么为什么通过哈夫曼编码后得到的二进制码不会有前缀的问题呢?
这是因为在哈夫曼树中,每个字母对应的节点都是叶子节点,而他们对应的二进制码是由根节点到各自节点的路径所决定的,正因为是叶子节点,每个节点的路径不可能和其他节点有前缀的关系。

为什么通过哈夫曼编码获得的二进制码短呢?
因为哈夫曼树是带权路径长度最短的树,权值较大的节点离根节点较近。而带权路径长度是指:树中所有的叶子节点的权值乘上其到根节点的路径长度,这与最终的哈夫曼编码总长度成正比关系的。对于第二种方式的编码,我们也可以按0左1右的规则构成一棵二叉树,但显然他没有按权值高的节点离根节点近的原则去构建二叉树,带权路径长度更长,二进制码也更长。

————————————————
版权声明:本文为CSDN博主「von Libniz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Demon_LMMan/article/details/115789360

哈夫曼编码(Huffman Coding)多图详细解析相关推荐

  1. 数据压缩之经典——哈夫曼编码(Huffman)

    (笔记图片截图自课程Image and video processing: From Mars to Hollywood with a stop at the hospital的教学视频,使用时请注意 ...

  2. 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding)

    哈夫曼树Huffman tree 又称最优完全二叉树,切入正题之前,先看几个定义 1.路径 Path 简单点讲,路径就是从一个指定节点走到另一个指定节点所经过的分支,比如下图中的红色分支(A-> ...

  3. 霍夫曼树:霍夫曼编码(Huffman Tree:Huffman Coding)

    一.简介 霍夫曼树常处理符号编写工作.根据整组数据中符号出现的频率高低,决定如何给符号编码.如果符号出现的频率越高,则给符号的码越短,相反符号的号码越长. 相关术语 路径:从书中一个节点到另一个节点之 ...

  4. 贪心算法 - 哈夫曼编码 Huffman

    转载地址  :   http://blog.csdn.net/xuefeng0707/article/details/7844834 哈夫曼编码: 一种字符编码方式,常用于数据文件压缩.压缩率通常在2 ...

  5. 哈夫曼编码(Huffman)Java实现代码简化版

    这个网上发现的Huffuman编码Java实现在组织上相对简化,便于理解文件压缩过程:提取文件统计字符频度-根据字符频度创建huffman树-根据huffman树生成huffman可变字长无前缀编码- ...

  6. python哈夫曼编码注意_Python 算法(2) 哈夫曼编码 Huffman Encoding

    这个问题原始是用来实现一个可变长度的编码问题,但可以总结成这样一个问题,假设我们有很多的叶子节点,每个节点都有一个权值w(可以是任何有意义的数值,比如它出现的概率),我们要用这些叶子节点构造一棵树,那 ...

  7. 哈夫曼编码(Huffman)Java实现代码

    网上找到的一个组Huffman编码Java实现代码,比较经典. 1.主类,压缩和解压 package cn.hm;import java.io.BufferedInputStream; import ...

  8. 哈夫曼编码(Huffman Coding)

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

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

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

  10. 霍夫曼编码(Huffman Coding)

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

最新文章

  1. 中国最懂自动驾驶量产公司秀肌肉:自动驾驶算力怪兽、百亿参数云端超大模型、百万公里路测里程...
  2. Sublime text 2/3 中 Package Control 的安装与使用方法
  3. java如何获取明天的时间_java获取各种格式的时间,获取昨天明天日期,获取一天的开始结束时间...
  4. Oracle递归操作
  5. 自动化测试如何解决验证码的问题
  6. 用友ERP服务器的连接
  7. 理解JWT(JSON Web Token)认证及python实践
  8. Redis持久化-深入理解AOF,RDB
  9. 值得借鉴的促销海报模板素材,卖不出去都难
  10. linux 常见命令 cp,Linux 常用命令之cp,一个可以煮饭的工具;
  11. php自定义通讯协议,PHP自定义协议攻击 by L0st
  12. php数据入库流程,php数据库操作
  13. 人脸对齐(十七)--DenseReg
  14. C语言深度剖析-----数组基础
  15. 移动广告聚合平台经验分享:芒果、果合、Adview、抓猫哪家好?
  16. sql和mysql 语法区别吗_sql和mysql语法有什么不同
  17. BIM模型文件下载——江湖别墅Revit模型
  18. 现代经济感悟(4)-为什么一分钱一分货,两分货却要一块钱
  19. 阿里云ECS静态建站学习
  20. 在dropdown item中设置退出登录

热门文章

  1. acrobat支持日文粘贴复制
  2. m451dn linux驱动下载,惠普m451dn驱动下载-惠普hp m451dn打印机驱动下载 v61.120.04官方版--pc6下载站...
  3. 双三次插值算法的C++实现与SSE指令优化
  4. 仓库5s管理推行难点分析
  5. matlab线型与颜色
  6. EditText的属性介绍
  7. 依云工资查询系统升级至6.4
  8. ImageAI (二) 使用Python快速简单实现物体检测 Object Detection
  9. python播放全网视频+打包成exe
  10. PC大作[微软模拟飞行10]