哈夫曼编码的理解(Huffman Coding)
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)相关推荐
- 哈夫曼编码的理解以及简单实现
哈夫曼树 在介绍哈夫曼编码前,我们先来了解一下哈夫曼树. 美国科学家哈夫曼在1952年发现了哈夫曼编码,为了纪念他的成就,于是把他在编码中用到的特殊二叉树称之为哈夫曼树,这种编码方法称之为哈夫曼编码. ...
- 信息论霍夫曼编码c语言,Huffman 信息论与编码 - 下载 - 搜珍网
霍夫曼编码/Shiyan4/Shiyan.sln 霍夫曼编码/Shiyan4/Shiyan.suo 霍夫曼编码/Shiyan4/Shiyan.v11.suo 霍夫曼编码/Shiyan4/Shiyan4 ...
- 霍夫曼算法_霍夫曼编码算法
霍夫曼算法 In this tutorial, we'll be discussing and implementing the Huffman Coding Algorithm in Java. 在 ...
- 2022黄文嵩商盛兰张阳徐铭信息论课程作业 哈夫曼编码(Huffman Coding)简介
目录 5G,华为,土耳其--我花了两个月,搞懂了5G背后的秘密_哔哩哔哩_bilibili 一.什么是编码? 二.哈夫曼编码 1.编码过程 2.码方差 3.编码特点 4.人无完人,码无完码 三.总结 ...
- C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码
David A. Huffman 哈夫曼编码简史(Huffman code) 1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试.导师Robert M. Fano给他们的学期 ...
- 二进制哈夫曼编码c语言实现,二进制霍夫曼编码
通过查看其他博客的内容,整理一篇关于二进制霍夫曼编码的笔记供大家参考和讨论,如果有错误,欢迎大家联系我批评指正. 一.二进制霍夫曼的原理 我们可以将二进制霍夫曼编码拆分理解: 二进制即 0.1: 二进 ...
- 信息论霍夫曼编码c语言,霍夫曼编码
<信息论与编码>课程实验报告 姓 名 学 号 单 位 专 业 2014 年 12 月 4 日 实验一 一.实验目的 1.理解信源编码的意义: 2.掌握霍夫曼编码的方法及计算机实现: 二.实 ...
- 哈夫曼编码(Huffman Coding)
霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...
- 霍夫曼编码(huffman coding) (java实现)
文章目录 一.浅谈赫夫曼编码 二.获取赫夫曼编码 1.获取字符出现的次数 2.创建赫夫曼树 3.指定编码 三.代码实现 1.指定编码代码 2.完整代码 总结 提示:以下是本篇文章正文内容,下面案例可供 ...
- 霍夫曼编码(Huffman Coding)
霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...
最新文章
- chrome使用技巧(看了定不让你失望)
- MVC之前的那点事儿系列(2):HttpRuntime详解分析(上)
- 现实世界的Windows Azure:采访圣地亚哥公共安全小组的技术经理Adrian Gonzalez
- [原创]基于frida的脱壳工具
- C++中数字和字符的转换
- es6 作为对象属性的Generator函数
- python邮件发送_Python实现邮件发送
- python中的运算符重载_Python中的操作符重载
- 2007年测试员的工具选择排名
- 土地利用转移矩阵图怎么做_如何用Arcgis做土地利用转移矩阵?求教各位..._土地估价师_帮考网...
- 刻录光驱只能读不能写怎么办?来看看!
- N1完美刷入Armbian系统
- 中英对照泰戈尔《飞鸟集》(一)
- Borland 26年风雨路
- uni-app学习路线与建议
- 广东省如何办理甲级测绘资质
- Photoshop CC 2019快速选择工具的抠图
- 服务器微信了早上好,早上好微信问候语(精选50句)
- 耦合协调度指标如何分析?
- Mybatis——主子表查询的Mapper