网站首页 > 技术教程 正文
一. 诞生原因
找出存放一串字符所需的最少的二进制编码。
二. 构造方法
首先统计出每种字符出现的频率,即:概率、权值。
例如:频率表 A:60, B:45, C:13 D:69 E:14 F:5 G:3
第一步:找出字符中频率最小的两个,小的在左边,大的在右边,组成二叉树。在频率表中删除此次找到的两个数,并加入此次最小两个数的频率和。
F 和 G 最小,如下图所示,从字符串频率计数中删除 F 与 G,并返回 G 与 F 的和 8 给频率表。
第二步:频率表 A:60, B:45, C:13 D:69 E:14 FG:8
频率最小的是 FG:8 与 C:13,如下图所示,并返回 FGC 的和 21 给频率表。
第三步:频率表 A:60 B: 45 D: 69 E: 14 FGC: 21
如图
频率表 A:60 B: 45 D: 69 FGCE: 35
频率表 A:60 D: 69 FGCEB: 80
频率表 AD:129 FGCEB: 80
添加 0 和 1,规则左 0 右 1 。
频率表 A:60, B:45, C:13 D:69 E:14 F:5 G:3
每个字符的二进制编码为(从根节点到对应的叶子节点,路径上的值拼接起来就是叶子节点字母的应该的编码)
字符 | 编码 |
A | 10 |
B | 01 |
C | 0011 |
D | 11 |
E | 000 |
F | 00101 |
G | 00100 |
那么当我想传送 ABC 时,编码为 10 01 0011,该编码就是 霍夫曼编码 。
对于解码操作来说,编码接收方同时接收到编码中对应的字符列表以及各个字符的概率值,重新建立霍夫曼树,从而根据编码每次从树的根遍历至树的叶子节点,最终还原整个字符串。
三、总结
1、出现得越多的字母,他的编码越短 ;出现频率越少的字母,他的编码越长。
在信息传输过程中,如果这个字母越多,那么我们希望他越瘦小(编码短)这样占用的编码越少,其实编码长的字母也是让频率比它多的字母把编码短的位子都占用后,他才去占用当前最短的编码。至此让总的编码长度最短。
实际上这就是贪心算法。
2、保证长编码的不与短编码的字母冲突。
比如不能出现读码读到 01 还有长编码的字母为 011,如果短编码为一个长编码的左起子串,这就是冲突,意思就是说读到当前位置已经能确定是什么字母时不能因为再读取一位或几位让这个编码能表示另外的字母。
哈夫曼树(最优二叉树)在构造的时候避免了这个问题。为什么能避免呢,因为哈夫曼树的它的字母都在叶子节点上,因此不会出现一个字母的编码为另一个字母编码左起子串的情况。
3、霍夫曼树不是唯一的。
同一字符串,可以构建出不同的霍夫曼树,例如将上例的构建规则改为频率较低的放在右边,频率较高的放在左边,这样构建的树就不同了。总的来说这叫同权不同构。
四、应用场景
典型的应用场景就是数据压缩,压缩一个 txt 文件,将其二进制转成 Base 64 编码,对该编码串建立霍夫曼树,从而可以得到霍夫曼编码。该编码相对于原 Base 64 串来说体积小很多,从而达到了数据压缩的目的。
五、其他
在实际编码过程中,如何快速找到频率表中最小的两个值呢,这里可以采用 堆结构 来实现。
猜你喜欢
- 2025-01-12 H.265已落后!下一代视频技术实现重大突破
- 2025-01-12 AMD RX 6000显卡也赶上潮流:支持AV1视频编码
- 2025-01-12 Win11 原生支持,微软发布 DirectX 12 全新视频编码 API
- 2025-01-12 视频硬件编码更快但为什么都用软件编码?实测让你搞清楚如何选择
- 2025-01-12 Python实现Base64编码和解码的示例
- 2025-01-12 高通发布aptX Lossless编码,提供CD级蓝牙音质
- 2025-01-12 监控系统中解码器解码上墙操作方法
- 2025-01-12 “姚贝娜病逝”报道的“编码”与“解码”
- 2025-01-12 50个策划人必备的营销模型——编码/解码和用户决策理性/感性
- 2025-01-12 Python 中 base64 编码与解码
你 发表评论:
欢迎- 最近发表
-
- linux CentOS检查见后门程序的shell
- 网络安全工程师演示:黑客是如何使用Nmap网络扫描工具的?
- Linux中ftp服务修改默认21端口等(linux修改ftp配置文件)
- Linux系统下使用Iptables配置端口转发,运维实战收藏!
- 谈谈TCP和UDP源端口的确定(tcp和udp的端口号相同吗)
- Linux 系统 通过端口号找到对应的服务及相应安装位置
- 快速查找NAS未占用端口!Docker端口秒级排查+可视化占坑双杀技
- 【知识杂谈#2】如何查看Linux的(本地与公网)IP地址与SSH端口号
- 如何在Linux中查询 DNS 记录,这三个命令可谓是最常用、最经典的
- 【Linux系统编程】特殊进程之守护进程
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)