哈夫曼树 哈夫曼编码

article/2025/8/25 9:35:16

哈夫曼树

哈夫曼树的定义:设二叉树具有 n 个带权值的叶节点,那么从根节点到各个叶节点的路径长度与相应叶节点权值的乘积的和,叫作二叉树的带权路径长度 WPL (Weighted Path Length)。具有最小带权路径长度的二叉树称为哈夫曼树 (Huffman Tree),也称为最优二叉树。权值较大的结点离根较近。

构造哈夫曼树的原则(贪心思想):

  • 权值越大的叶节点越靠近根节点
  • 权值越小的叶节点越远离根节点

哈夫曼编码

哈夫曼编码就是规定哈夫曼树中的左分支为 0,右分支为 1,从根节点到每个叶节点所经过的分支对应的 0 和 1 组成的序列便为该节点对应字符的编码。这样的编码称为哈夫曼编码。

哈夫曼编码其实就是哈夫曼树的一个非常重要的应用,是可变字长编码 (VLC) 的一种,目的是为了减少存储体积。

如何减少存储体积呢?举个例子:一篇文档只包含字母 A、B、C、D、E、F,它们的出现次数为:A 30次,B 25次,C 20次,D 10次,E 10次,F 5次

在数据传送时,信息表现为 0 和 1 的二进制比特流形式。如果每个字符都是定长编码,由于总共有 6 中字母,则每个字母最少使用 3 bit 表示,最终对应编码如下:

字符编码
A000
B001
C010
D011
E100
F101

存储空间大小计算:(30 + 25 + 20 + 10 + 10 + 5) * 3 = 300 bit

我们知道,网络数据传输时,传输数据越大,就越消耗网络的带宽。为了提高传输的速度,可以采用变长的编码方式,寻找更优的编码方式。我们其实可以按照字符出现的概率分配码长,实现平均码长最短的编码。也就是说,设计编码可以考虑让出现多的字符编码尽量更短,出现少的字符编码稍微长点没关系,是一种贪心思想。这样就能使得存储空间大小降低,提高传输速度。而哈夫曼编码算法正是用来解决该问题的。

但是,你需要考虑的一个问题是,二进制开始 0,1,01,10,11 这个顺序 ,如果来了 001 这个编码,它到底是 (0,0,1) 还是 (0,01) 呢?所以编码不等长的时候你要考虑到这个编码要有唯一性不能出现歧义。这个怎么搞呢?计算机只知道 01 二进制,而二叉树刚好有左右两个节点,至于一个字符它如果是对应叶子节点,那么就可以直接确定,也就是说这个数值不能映射到二叉树的非叶子节点上。

具体的编码过程是:

  1. 初始化 n 个字符单节点的树,每个字符具有概率,记为权重。
  2. 找到权重最小的两个树,把它们作为新树的左右子树,权重之和作为新树的根节点的权重。
  3. 重复第 2 步直到剩下一棵单独的树。
  4. 左子树的一边标 0,右子树一边标 1,从根节点到叶子节点的路径就是哈夫曼编码。

在这里插入图片描述

对应哈夫曼编码如下表:

字符编码
A00
B01
C10
D110
E1110
F1111

存储空间大小计算:2*30 + 2*25 + 2*20 + 3*10 + 4*10 + 4*5 = 240 bit

哈夫曼(霍夫曼)编码是一种无前缀编码。解码时不会混淆。其主要应用在数据压缩,加密解密等场合。


http://chatgpt.dhexx.cn/article/jycZXswV.shtml

相关文章

哈夫曼树(Huffman Tree)

定义 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是…

哈夫曼树详解

一、哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉…

哈夫曼树(Huffmantree)

1.基本概念 哈夫曼树又称为最优树,是一类带权路径长度最短的树。 一些概念的定义: (1)路径:树的两个结点之间的连线称为路径。 (2)路径长度:路径上的分支数目称作路径长度。若规定…

哈夫曼树详解及其应用(哈夫曼编码)

一,哈夫曼树的基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 结点的路径长度:两结点之间路径上的分支数 树的路径长度:从树根到每一个结点的路径长度之和.记作:&#xff3…

哈夫曼树编码的实现+图解(含全部代码)

目录 哈夫曼树的基本概念 ------------哈夫曼树的构造方法 ------------------------哈夫曼编码 ------------------------------------全部代码 哈夫曼树的基本概念 哈夫曼树通常以二叉树的形式出现,所以也称最优二叉树,是一类带权路径长度最短的树…

哈夫曼树(C语言实现)

文章目录 哈夫曼树的基本概念哈夫曼树的构建构建思路代码实现 哈夫曼编码的生成编码生成思路代码实现 完整代码展示以及代码测试 哈夫曼树的基本概念 在认识哈夫曼树之前,你必须知道以下几个基本术语: 1、什么是路径? 在一棵树中&#xff0c…

打开VS2010提示:产品密钥框

打开VS2010提示:产品密钥框,如下图: …

VS 2017 产品密钥

个人分类: vs2010 Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017(VS2017) 专业版 Professional 激活码key:KBJFW-NXHK6-W4WJM-CRM…

vs++2010学习版的注册密钥

6VPJ7-H3CXH-HBTPT-X4T74-3YVY7 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行…

存储过程入门

参考文章 Oracle Database concepts guide(11g2) By Thomas KyteStored Procedure Wiki 先修知识 数据库的基本概念SQL 什么是存储过程(Stored Procedure): 一段存储在数据库的“子程序”,下面对这两个…

【MySQL存储过程】创建一个简单的存储过程

什么是存储过程和函数 存储过程和函数是在数据库中定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复编写相同的SQL语句。而且,存储过程和函数是在MySQL服务器中存储和执行的&…

什么是存储过程

什么是存储过程:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到…

MySQL-存储过程

文章目录 存储过程一. 存储过程的创建和使用1. 创建存储过程2. 删除存储过程3. 查看存储过程4. 调用存储过程5. 例题 二. 变量1. 系统变量1.1 全局变量1.2 会话变量 2. 自定义变量2.1 用户变量2.2 局部变量 三. 存储过程参数3.1 说明:3.2 例题 四. 流程控制1. IF语句…

存储过程怎么使用

1.什么是存储过程? 存储过程是封装了一条或多条SQL的集合。它的好处是简单、高性能、安全。2.为什么要使用存储过程? 简化复杂的操作,把SQL封装起来容易使用。 如果所有开发人员和应用程序都使用同一存储过程,则所有使用的代码都…

SQL创建存储过程

创建SQL存储过程需要使用到的语法 - 创建存储过程 CREATE 存储过程的名称(参数) BEGIN ...需要执行的SQL语句 END- 调用 CALL 存储过程的名称(参数)个人看法,这就是一个函数...无参数 CREATE PROCEDURE p_student_select() BEGIN SELECT * FROM student; ENDCALL …

4.3.1 存储过程的简要介绍

4.3.1 存储过程的简要介绍 1、什么是存储过程? 存储过程是一种命名的PL/SQL代码块。它既可以没有参数,也可以有若干输入、输出参数,甚至可以有多个既作输入又作输出的参数,但他通常没有返回值。 存储过程被保存在数据库中&#x…

储存过程

储存过程是一组为了完成特定功能的SQL语句表,经过编译后储存在数据库中,用户通过指定过程的名字并给定参数来调用执行它。 从常用的操作数据库的SQL语句在执行的时候需要先编译,然后执行,储存过程,则是采用另外一种方式…

java笔试--北京轩宇信息

第一题 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths;/*** <p>功能: 编写程序,在C盘根目录下创建文件myFile.txt&#xff0c;文件内容如下&#xff0c;请注意缩进和换行&#xff1a;* Java* C/C* Python* JavaScripts*/ public…

笔试——中兴

参考达尔文公众号&#xff1a;https://mp.weixin.qq.com/s?__bizMzg5MDIwNjIwMA&mid2247496018&idx1&snf8109b6f5b5ea3a175e52eb7074bb7bc&chksmcfe293c5f8951ad3570a64a07ce0deba1ec12f3c8d0a15bbf1c64ed25e5faca46ef5974fef72&mpshare1&scene23&…

中兴2016笔试题答案Java_中兴Java笔试题

中兴Java笔试题 一、选择题(每题4分,共80分) 1. 编译Java Application 源程序文件将产生相应的字节码文件&#xff0c;这些字节码文件的扩展名为( ) A. .java B. .class C. .html D. . 2. main方法是Java Application程序执行的入口点&#xff0c;关于main方法的方法头以下哪项…