huffman树概念、构造方法及huffman编码

2024-08-30 08:12

本文主要是介绍huffman树概念、构造方法及huffman编码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概念

Huffman树概念

Huffman树(霍夫曼树),也称为最优二叉树,是一种特殊的二叉树,广泛应用于数据压缩领域。它基于字符出现的频率或概率构建,使得整体的平均编码长度最小,从而达到压缩数据的目的。在Huffman树中,频率或概率越高的字符距离根节点越近,这样可以确保常用字符使用较短的编码,不常用字符使用较长的编码。

Huffman树的构造方法

  1. 初始化:将待编码的字符及其频率作为叶子节点,创建一个节点列表。
  2. 构建树
    • 在节点列表中选取两个频率最低的节点作为左右子节点,创建一个新的内部节点,其频率为这两个子节点频率之和。
    • 将选中的两个节点从列表中移除,将新创建的节点加入列表。
    • 重复上述过程,直到列表中只剩下一个节点,这个节点即为Huffman树的根节点。
  3. 生成Huffman编码:从根节点开始,向左走记为0,向右走记为1,直到达到叶子节点,此时形成的0和1序列即为该字符的Huffman编码。

Huffman编码

Huffman编码是一种变长编码方法,它根据字符出现的频率来分配编码长度,频率高的字符分配较短的编码,频率低的字符分配较长的编码。Huffman编码是前缀编码,即没有任何字符的编码是另一个字符编码的前缀,这保证了编码的唯一解码性。

Huffman编码的特点

  • 最优性:对于一给定的字符集和频率分布,Huffman编码能够生成最短的平均编码长度。
  • 前缀无歧义:任何字符的编码都不是另一个字符编码的前缀,使得编码具有唯一的解码方式。
  • 适应性:Huffman编码适用于字符频率分布不均匀的情况,能够根据实际数据动态生成编码表。

应用

Huffman编码广泛应用于数据压缩领域,如ZIP文件压缩、JPEG图像压缩等。通过Huffman编码,可以有效减少存储空间和传输带宽的需求,提高数据处理效率。

总结

Huffman树是数据压缩中的一种重要技术,通过构建最优二叉树,为不同频率的字符分配不同长度的编码,实现数据的有效压缩。Huffman编码的最优性和前缀无歧义性使其成为数据压缩中不可或缺的工具。

示例

示例数据

假设我们有以下字符及其频率:

  • A (频率: 3)
  • B (频率: 2)
  • C (频率: 6)
  • D (频率: 8)
  • E (频率: 2)
  • F (频率: 6)

步骤1:初始化

首先,我们将每个字符及其频率作为一个节点,这些节点暂时都是树的叶子节点。

步骤2:构建Huffman树

  1. 选择频率最低的两个节点:E (2)和B (2)。
  2. 合并这两个节点:创建一个新的内部节点EB,其频率是E和B的频率之和,即4。这个新节点将E和B作为子节点。
  3. 重复选择和合并过程,直到只剩下一个节点,这个节点即为Huffman树的根节点。

按照频率合并的过程如下:

  • 合并E (2)和B (2)得到EB (4)
  • 合并A (3)和EB (4)得到AEB (7)
  • 合并F (6)和C (6)得到FC (12)
  • 合并AEB (7)和FC (12)得到AEBFC (19)
  • 合并AEBFC (19)和D (8)得到根节点AEBFCD (27)

步骤3:生成Huffman编码

从根节点开始,向左走记为0,向右走记为1。

ASCII艺术表示的Huffman树

         AEBFCD(27)/      \AEB(7)      D(8)/    \      A(3)  EB(4)  /    \E(2)  B(2)

Huffman编码结果

  • A:00
  • E:010
  • B:011
  • F:10
  • C:11
  • D:1

这样,我们就根据给定字符及其频率构建了一个Huffman树,并为每个字符生成了相应的Huffman编码。这些编码是最优的,因为它们确保了整体的平均编码长度最小,从而达到数据压缩的目的。

这篇关于huffman树概念、构造方法及huffman编码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120272

相关文章

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

form表单提交编码的问题

浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urlencoded; charset=UTF-8        那么我们如果需要修改编码,不使用默认的,那么可以如下这样操作修改编码,来满足需求: hmtl代码:   <meta http-equiv="Conte

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

计算机网络基础概念 交换机、路由器、网关、TBOX

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、VLAN是什么?二 、交换机三、路由器四、网关五、TBOXTelematics BOX,简称车载T-BOX,车联网系统包含四部分,主机、车载T-BOX、手机APP及后台系统。主机主要用于车内的影音娱乐,以及车辆信息显示;车载T-BOX主要用于和后台系统/手机APP通信,实现手机APP的车辆信息显示与控

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4

【机器学习-一-基础概念篇】

机器学习 定义分类算法 应用 定义 机器学习最早是被Arthur Samuel 提出的一个概念,指计算机无需明确编程即可学习的研究领域。1950年他发明的跳棋程序,这个人机对弈游戏让他的声名鹊起,机器学习这个概念才进入大众的是视线。 在这个跳棋程序里,他编程了一种算法,这个程序与Arthur下了数万次跳棋,计算机逐渐学会了下在哪里有更大的可能会赢得比赛,哪里会输,通过这种方法,最

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。