图解哈夫曼(Huffman)编码树

简介: 图解哈夫曼(Huffman)编码树

1 引言

哈夫曼(Huffman)编码算法是基于二叉树构建编码压缩结构的,它是数据压缩中经典的一种算法。算法根据文本字符出现的频率,重新对字符进行编码。因为为了缩短编码的长度,我们自然希望频率越高的词,编码越短,这样最终才能最大化压缩存储文本数据的空间。

假设现在我们要对下面这句歌词“we will we will r u”进行压缩。我们可以想象,如果是使用ASCII码对这句话编码结果则为:119 101 32 119 105 108 108 32 119 101 32 119 105 108 108 32 114 32 117(十进制表示)。我们可以看出需要19个字节,也就是至少需要152位的内存空间去存储这些数据。


直接ASCII码编码是很浪费空间的,Unicode就更不用说了,下面我们先来统计一下这句话中每个字符出现的频率。如下表,按频率高低已排序:

image.png

2 哈夫曼二叉树构建

2.1 初始队列

那么我们按出现频率高低将其放入一个优先级队列中,从左到右依次为频率逐渐增加。

image.png

下面我们需要将这个队列转换成哈夫曼二叉树,哈夫曼二叉树是一颗带权重的二叉树,权重是由队列中每个字符出现的次数所决定的。并且哈夫曼二叉树始终保证权重越大的字符出现在越高的地方。

2.2 第一步合并

首先我们从左到右进行合并,依次构建二叉树。第一步取前两个字符u和r来构造初始二叉树,第一个字符作为左节点,第二个元素作为右节点,然后两个元素相加作为新空元素,并且两者权重相加作为新元素的权重。

image.png

同理,新元素可以和字符i再合并,如下:

image.png

2.3 重新调整队列

上图新元素权重相加后结果是变大了,需要对权重进行重新排序。

image.png

然后再依次从左到右合并,每合并一次则进行一次队列重新排序调整。如下:

image.png

经过多步操作之后,得到以下的哈夫曼二叉树结构,也就是一个带有权重的二叉树:

image.png

2.4 哈夫曼编码

有了上面带权重的二叉树之后,我们就可以进行编码了。我们把二叉树分支中左边的支路编码为0,右边分支表示为1,如下图:

image.png

这样依次遍历这颗二叉树就可以获取得到所有字符的编码了。例如:‘ ’的编码为10,‘l’的编码为00,‘u’的编码为11100等等。经过这个编码设置之后我们可以发现,出现频率越高的字符越会在上层,这样它的编码越短;出现频率越低的字符越会在下层,编码越短。经过这样的设计,最终整个文本存储空间才会最大化的缩减。

 最终我们可以得到下面这张编码表:

image.png

2.5 字符串编码

有了上面的编码表之后,”we will we will r u”这句重新进行编码就可以得到很大的压缩,编码表示为:01 110 10 01 1111 00 00 10 01 110 10 01 1111 00 00 10 11101 10 11100。这样最终我们只需50位内存,比原ASCII码表示节约了2/3空间,效果还是很理想的。当然现实中不是简单这样表示的,还需要考虑很多问题。

参考

目录
相关文章
|
文字识别 并行计算 语音技术
ModelScope问题之下载模型文件报错如何解决
ModelScope模型报错是指在使用ModelScope平台进行模型训练或部署时遇到的错误和问题;本合集将收集ModelScope模型报错的常见情况和排查方法,帮助用户快速定位问题并采取有效措施。
4283 3
成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题
成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题
成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题
|
XML 前端开发 数据格式
selenium--Xpath定位
selenium--Xpath定位
|
Java 数据库连接 数据库
不可不知道的Spring 框架七大模块
Spring框架是一个全面的Java企业级应用开发框架,其核心容器模块为其他模块提供基础支持,包括Beans、Core、Context和SpEL四大子模块;数据访问及集成模块支持数据库操作,涵盖JDBC、ORM、OXM、JMS和Transactions;Web模块则专注于Web应用,提供Servlet、WebSocket等功能;此外,还包括AOP、Aspects、Instrumentation、Messaging和Test等辅助模块,共同构建强大的企业级应用解决方案。
|
安全 数据挖掘 测试技术
深入探究软件测试中的风险分析与管理
【5月更文挑战第7天】 在软件开发生命周期中,风险分析与管理是确保产品质量和项目成功的关键步骤。本文将探讨软件测试过程中如何有效进行风险评估、分类及采取相应的缓解措施。文章首先介绍了风险管理的重要性,然后详细阐述了风险识别的技术和工具,接着分析了如何制定和实施风险应对策略。最后,通过案例研究展示了一个结构化风险分析流程的实施效果。
485 2
|
存储 缓存 负载均衡
(*长期更新)软考网络工程师学习笔记——Section 17 交换技术原理
(*长期更新)软考网络工程师学习笔记——Section 17 交换技术原理
(*长期更新)软考网络工程师学习笔记——Section 17 交换技术原理
|
存储 弹性计算 数据挖掘
阿里云服务器实例选择参考:经济型、通用算力型与通用型的比较
在我们选择阿里云服务器实例规格的时候,很多用户可能会对众多的实例规格感到困惑。特别是对于2核8G、4核16G和8核32G这些热门的配置,阿里云提供了经济型e、通用算力型u1、通用型g7和通用型g8y四种实例。虽然这些配置在硬件上相似,但它们的价格和适用场景却是不同的。本文将帮助用户理解这些差异,并为不同的使用场景推荐最合适的实例。
1673 0
阿里云服务器实例选择参考:经济型、通用算力型与通用型的比较
|
机器学习/深度学习 人工智能 自然语言处理
Python在人工智能领域的应用案例分析
一、引言 随着人工智能技术的飞速发展,Python作为一种功能强大、易学易用的编程语言,在人工智能领域发挥着越来越重要的作用。本文将介绍Python在人工智能领域的应用案例,包括机器学习、深度学习、自然语言处理等方面,帮助读者了解Python在人工智能领域的实际应用和优势。
1604 0
|
机器学习/深度学习 人工智能 自然语言处理
超强满血不收费的AI绘图教程来了(在线Stable Diffusion一键即用)
超强满血不收费的AI绘图教程来了(在线Stable Diffusion一键即用)
1631 1
|
架构师 算法 测试技术
嵌入式系统软件架构设计(长篇深度好文)
嵌入式系统软件架构设计(长篇深度好文)
9294 3

热门文章

最新文章