首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >赫夫曼编码&解码

赫夫曼编码&解码

作者头像
贪挽懒月
发布于 2020-12-01 02:31:27
发布于 2020-12-01 02:31:27
1.9K00
代码可运行
举报
文章被收录于专栏:JavaEEJavaEE
运行总次数:0
代码可运行

之前说到了如何构建赫夫曼树,那么赫夫曼树有什么用呢?赫夫曼树经典的应用之一就是赫夫曼编码

1. 赫夫曼编码是什么?

它是一种编码方式,可以用在电讯通信中,或者用于对数据文件进行压缩,压缩率一般在20%到90%。

2. 为什么要有赫夫曼编码?

我们要在网络中传输一句话,首先要将这句话的所有内容转成对应的Ascii码,然后再将Ascii转成二进制,这样一来,可能这句话原本长度是40,经过转换后会变得很长。这种编码方式叫定长编码,效率很低。其实我们可以统计这句话中各个字符出现的次数,然后用二进制数字记录这些字符出现的次数,对这句话进行编码时,将字符替换成对应的二进制就行了,这叫变长编码。但是这种编码方式也会有问题,就是最后传输的二进制串,对方在解码的时候,不知道哪些是要组合起来的,比如最后二进制串是101101……,到底第一位的1是单独解码呢还是要和第二位的0组合起来10才表示一个字符呢?这就造成了解码的多异性。赫夫曼编码就可以解决这个问题。

3. 赫夫曼编码原理:

假如现在要对i like like like java do you like a java这句话(长度是40)进行编码,过程如下:

  • 统计各个字符出现的次数:d:1次 y:1次 u:1次 j:2次 v:2次 o:2次 i:4次 k:4次 e:4次 i:5次 a:5次 空格:9次
  • 按照上面的字符出现的次数构建赫夫曼树,构建方法和之前讲的构建赫夫曼树一样。
  • 根据赫夫曼树,给各个字符编码。规定向左的路径为0,向右路径为1,然后路径数字组合起来就是该字符的编码。比如到a字符的路径是先向右,再向左,再向左,那么a的编码就是100
  • 最终各个字符的编码如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
o:1000   u:10010   d:100110   y:100111  i:101
a:100   k:1110   e:1111   j:0000   v:0001   l:001   空格:01
  • 可以发现,每个字符的编码,都不会是另一个字符编码的前缀,比如空格的编码是01,其他字符,没有是以01开头的,因为到二叉树两个不同的节点路径不可能一样,这样解决了解码多异性的问题。
  • 根据各个字符的编码,就可以得到要发送内容编码后的字符串,i是101,空格是01,l是001……要发送内容编码后就是10101001……,长度为133。
  • 可以发现,编码后的二进制字符串长度(133)远远超过了原始内容长度(40),所以还要压缩一下。压缩的方法就是将二进制字符串每8位转成一个数字再转成字节,最终得到的字节数组就是:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-88-65-56-65-56-65-5577-576-24-14-117-4-60-9028

长度为17,原始长度是40,压缩率为57.5%。

4. 赫夫曼解码:

本来是要发送i like like like java do you like a java这句话的,最终发送的是-88,-65,-56,-65,-56,-65,-55,77,-57,6,-24,-14,-117,-4,-60,-90,28,对方接收到后怎么还原成原始的那句话呢?其实这就是一个逆向操作了。

  • 编码的时候最后一步是压缩,那么这里就先要将接收到的字节数组解压成133位的字符串。即还原成10101001……这个字符串。
  • 然后再根据各个字符的编码,还原成原始发送的内容,即用10101001……对照下表,将内容还原即可。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
o:1000   u:10010   d:100110   y:100111  i:101
a:100   k:1110   e:1111   j:0000   v:0001   l:001   空格:01

5. 赫夫曼编码解码注意事项:

  • 如果文件本身就是经过压缩处理的,比如视频文件、ppt等,压缩率不会很高
  • 赫夫曼编码是按字节来处理的,因此可以处理所有的文件
  • 如果文件重复的内容不多,压缩率也不高
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[数据结构与算法]赫夫曼树与赫夫曼编码
给你一个数列 {13, 7, 8, 3, 29, 6, 1},要求转成一颗赫夫曼树.
时间静止不是简史
2020/07/24
1.2K0
数据结构实验哈夫曼编码算法的实现_哈夫曼编码算法的实现
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,
全栈程序员站长
2022/09/23
6920
数据结构实验哈夫曼编码算法的实现_哈夫曼编码算法的实现
【数据结构】哈曼夫树与哈夫曼编码
在上一篇内容中我们介绍了树与森林的遍历,并且我们还通过C语言实现了树与森林的遍历。
蒙奇D索隆
2025/03/20
2000
【数据结构】哈曼夫树与哈夫曼编码
文心一言 VS 讯飞星火 VS chatgpt (226)-- 算法导论16.3 8题
赫夫曼编码是一种可变长度编码方法,其原理是为出现频率高的字符分配较短的编码,为出现频率低的字符分配较长的编码,从而达到整体编码长度最短的目的。然而,在这种情况下,由于所有256个字符出现的频率大致相同,且最高频率也低于最低频率的2倍,这使得赫夫曼编码的优势无法充分展现。
福大大架构师每日一题
2024/04/11
1570
文心一言 VS 讯飞星火 VS chatgpt (226)-- 算法导论16.3 8题
【算法】赫夫曼树(Huffman)的构建和应用(编码、译码)
参考资料 《算法(java)》                           — — Robert Sedgewick, Kevin Wayne 《数据结构》                                  — — 严蔚敏 赫夫曼树的概念 要了解赫夫曼树,我们要首先从扩充二叉树说起 二叉树结点的度 结点的度指的是二叉树结点的分支数目, 如果某个结点没有孩子结点,即没有分支,那么它的度是0;如果有一个孩子结点, 那么它的度数是1;如果既有左孩子也有右孩子, 那么这个结点的度是2. 扩充
啦啦啦321
2018/03/30
2K0
【算法】赫夫曼树(Huffman)的构建和应用(编码、译码)
赫夫曼编码的生成方法及原理
4.带权路径的长度:树中所有的叶子节点的权值乘其到根节点的路径长度与最终的赫夫曼编码长度成正比关系。
用户11070251
2024/04/11
1540
赫夫曼编码的生成方法及原理
PHP数据结构(八) ——赫夫曼树实现字符串编解码(理论)
PHP数据结构(八)——赫夫曼树实现字符串编解码(理论) (原创内容,转载请注明来源,谢谢) 一、树和森林 1、树的三种存储结构 1)双亲表示法——数组下标、值、上一级数组下标(根节点下标为负一) 2)孩子表示法 方法一:孩子链表——数组下标、值、下一级数组链表(无下一级指向null) 方法二:带父节点的子链表——结合双亲表示法和孩子链表,包含数组下标、值、上一级数组下标(根节点下标为负一)、下一级数组链表(无下一级指向null)。 3)孩子兄弟表示法——又称二叉树表示法或二叉链表表示法,
用户1327360
2018/03/07
1.3K0
PHP数据结构(八) ——赫夫曼树实现字符串编解码(理论)
ZIP压缩算法详细分析及解压实例解释(下)
来源:esingchan - 博客园 链接:www.cnblogs.com/esingchan/p/3958962.html(点击尾部阅读原文前往) 7、ZIP中对CL进行再次压缩的方法 这里仍然沿用Huffman的想法,因为CL也是一堆整数,那么当然可以再次应用Huffman编码。不过在这之前,PK对CL序列进行了一点处理。这个处理也是很精巧的。 CL序列表示一系列整数对应的码字长度,对于literal/length来说,总共有0-285这么多符号,所以这个序列长度为286,每个符号都有一个码字长度,当然
智能算法
2018/04/02
2.9K0
ZIP压缩算法详细分析及解压实例解释(下)
3分钟,掌握加密交流并熟练使用
在信息化时代,数据传输的安全性和效率成为了至关重要的议题,为了实现这一目标,科学家们不断探索和创新,其中赫夫曼树(Huffman Tree)及其编码方法凭借其独特的优势,在数据压缩和加密领域展现出了卓越的应用价值。同时,在计算机数据传输中为了提高效率,也会用赫夫曼编码进行传输,本文将详细介绍赫夫曼编码,并结合实际案例小试牛刀,让大家更加深入体会加密交流的乐趣。
小明爱吃火锅
2025/02/04
1360
看懂哈夫曼编码
在计算机学科中,编码方式有很多种,对于Java开发而言,其中ASCII码和RFC3986(URL中非ASCII字符的编码)应该是我们最熟悉的了, 在ASCII编码表中我们会发现每一种字符都可以表示成相应二进制(八位定长的编码方式), 通过ASCII编码表,我们可以将对应编码转换成人们能直观理解的数据。
每天学Java
2020/06/01
9210
程序员需要了解的硬核知识之压缩算法
我们想必都有过压缩和 解压缩文件的经历,当文件太大时,我们会使用文件压缩来降低文件的占用空间。比如微信上传文件的限制是100 MB,我这里有个文件夹无法上传,但是我解压完成后的文件一定会小于 100 MB,那么我的文件就可以上传了。
cxuan
2019/11/12
1.2K0
PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践2)
PHP数据结构(八)——赫夫曼树实现字符串编解码(实践2) (原创内容,转载请注明来源,谢谢) 公众号规定不能超过3000字,只能分两篇,见谅。 由于需要分两篇来讲,本篇接上篇的内容,假定已经获取到编
用户1327360
2018/03/07
8420
原以为哈夫曼树、哈夫曼编码很难,结果……
哈夫曼树、哈夫曼编码很多人可能听过,但是可能并没有认真学习了解,今天这篇就比较详细的讲一下哈夫曼树。
main方法
2021/07/19
6960
原以为哈夫曼树、哈夫曼编码很难,结果……
文心一言 VS 讯飞星火 VS chatgpt (221)-- 算法导论16.3 3题
首先,赫夫曼编码是一种变长编码方式,其目标是使得编码的总长度最短。赫夫曼编码的生成基于赫夫曼树,其中树的每个内部节点表示两个子节点频率的和,而叶子节点则代表原始字符及其频率。在构建赫夫曼树时,我们每次选择频率最低的两个节点来生成一个新的父节点,直到只剩下一个节点(即根节点)为止。
福大大架构师每日一题
2024/03/26
2681
文心一言 VS 讯飞星火 VS chatgpt (221)-- 算法导论16.3 3题
【CPP】各种各样的树(8)——赫夫曼树
看完了这么多树,来看个二叉树的小应用——赫夫曼编码(Huffman Coding),是一种用于无损数据压缩的熵编码(权编码)算法。由大卫·霍夫曼在1952年发明(这居然只是他1951年的期末作业而已,1952年发表为论文《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)https://web.archive.org/web/20050530145744/http://compression.graphicon.ru/download/articles/huff/huffman_1952_minimum-redundancy-codes.pdf)。它又称最优二叉树,是一种带权路径长度最短的二叉树。是二叉树的一个常见应用。
ZifengHuang
2020/07/29
4450
【CPP】各种各样的树(8)——赫夫曼树
当Kotlin遇见数据结构丨哈夫曼解码
哈夫曼编码是一种编码格式,属于可变字长编码的一种,该方法依照字符出现的概率来构建异字头的平均长度最短的码字,最终实现根据使用频率来最大化节省码字(字符)的存储空间和提高传输效率的目的,在数据压缩和通讯领域应用的非常广泛。
码脑
2019/04/11
8890
当Kotlin遇见数据结构丨哈夫曼解码
《大话数据结构》树以及赫夫曼编码的例子
第六章 树 6.2 树的定义 树(Tree)的n个结点的有限集。当n=0时,称为空树。 任意一个非空树中: 1)有且仅有一个特定的称为根(root)的结点 2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2 …… 、Tm。其中每个集合本身又是一棵树,并且称为根的子树(SubTree)。 注意: 1)n>0时根节点的唯一的,不可能存在多个根节点。 2)m>0时,字数的个数没有限制,但是它们一定是互不相交的。 6.2.1 结点分类 结点拥有的子树个数称为结点的度(Degree)。 度为0的结
xcywt
2018/03/28
1K0
《大话数据结构》树以及赫夫曼编码的例子
6.6 赫夫曼树及其应用
1、从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称做路径长度。
小林C语言
2020/12/12
3580
6.6 赫夫曼树及其应用
赫夫曼树及其应用
在了解赫夫曼编码之前,我们必须了解一下赫夫曼树,赫夫曼编码就是基于赫夫曼树实现的。
半生瓜的blog
2023/05/12
2880
赫夫曼树及其应用
文心一言 VS 讯飞星火 VS chatgpt (224)-- 算法导论16.3 6题
为了表示字母表 C={0,1,…,n−1} 上的任意最优前缀码,并仅用 2n−1+n⌈lgn⌉ 位,我们可以按照以下步骤进行:
福大大架构师每日一题
2024/04/11
1650
文心一言 VS 讯飞星火 VS chatgpt (224)-- 算法导论16.3 6题
推荐阅读
相关推荐
[数据结构与算法]赫夫曼树与赫夫曼编码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档