通过两道题理解哈夫曼树

哈夫曼树定义

哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树。所谓带权路径长度是指树中所有的叶子结点的权值乘以其到根结点的路径长度(边数)。哈夫曼树广泛应用于数据压缩等领域,特别是在构建最优前缀码(如哈夫曼编码)时非常有效。

如何构造哈夫曼树

构造哈夫曼树的基本步骤如下:

  1. 将所有节点按权值排序,并视为一个森林(每个节点是一棵树)。
  2. 选出两个根节点权值最小的树合并,新的树的根节点权值为这两个根节点权值之和。
  3. 将新树重新放入森林,再次排序。
  4. 重复步骤2和3,直到森林中只剩下一棵树,这棵树即为哈夫曼树。

示例:构造哈夫曼树

题目一:给定的权值:3, 7, 8, 2, 6, 10, 14。我们将以这些权值构造哈夫曼树。并计算带权路径长度。

步骤

  1. 初始排序:2, 3, 6, 7, 8, 10, 14
  2. 合并最小两个:(2, 3) -> 5,新序列:5, 6, 7, 8, 10, 14
  3. 合并最小两个:(5, 6) -> 11,新序列:7, 8, 10, 11, 14
  4. 合并最小两个:(7, 8) -> 15,新序列:10, 11, 14, 15
  5. 合并最小两个:(10, 11) -> 21,新序列:14, 15, 21
  6. 合并最小两个:(14, 15) -> 29,新序列:21, 29
  7. 合并最后两个:(21, 29) -> 50,完成构造

  在哈夫曼树中,当两个节点合并时,通常较小的节点会放置在左侧,而较大的节点会放置在右侧。这是为了确保树的最终结构能够反映出频率的递增顺序,从而使得较低频率的字符具有较长的编码,而较高频率的字符具有较短的编码。

最终哈夫曼树结构

 

计算带权路径长度 (WPL)

带权路径长度(WPL)是所有叶子节点的权值乘以其到根节点的路径长度之和。

  • 2 * 4 = 8
  • 3 * 4 = 12
  • 6 * 3 = 18
  • 7 * 3 = 21
  • 8 * 3 = 24
  • 10 * 2 = 20
  • 14 * 2 = 28

WPL = 8 + 12 + 18 + 21 + 24 + 20 + 28 = 131

题目二:给定字母 a,b,c,d,e 的使用频率为 0.09,0.17,0.2,0.23,0.31。设计以该权值为基础的哈夫曼树,并给出哈夫曼编码?平均长度是多少?

步骤

  1. 初始排序:a (0.09), b (0.17), c (0.20), d (0.23), e (0.31)
  2. 合并最小两个:(a: 0.09, b: 0.17) -> ab: 0.26,新序列:c (0.20), d (0.23), ab (0.26), e (0.31)
  3. 合并最小两个:(c: 0.20, d: 0.23) -> cd: 0.43,新序列:ab (0.26), e (0.31), cd (0.43)
  4. 合并最小两个:(ab: 0.26, e: 0.31) -> abe: 0.57,新序列:cd (0.43), abe (0.57)
  5. 合并最后两个:(cd: 0.43, abe: 0.57) -> abcde: 1.00哈夫曼树结构

哈夫曼编码:(编码的规则通常是:向左走记录为 "0",向右走记录为 "1"。这样,每个字母的编码可以通过追踪从根节点到该字母节点的路径来确定)

c: 从根节点到c的路径是左左,编码是 00.

d: 从根节点到d的路径是左右,编码是 01.

a: 从根节点到a的路径是右左左,编码是 100.

b: 从根节点到b的路径是右左右,编码是 101.

e: 从根节点到e的路径是右右,编码是 11.

这些编码反映了每个字符的相对频率:较低频率的字符(如a和b)具有较长的编码,而较高频率的字符(如e)具有较短的编码。这种编码方法确保了总体编码长度尽可能短,从而实现有效的数据压缩。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centroid-Aware Feature Recalibration for Cancer Grading in Pathology Images论文速读

Centroid-Aware Feature Recalibration for Cancer Grading in Pathology Images 摘要 癌症分级是病理学中的一项重要任务。人工神经网络在计算病理学领域的最新发展表明,这些方法在提高癌症诊断的准确性和质量方面具有巨大潜力。然而,这些方法的稳健性…

面试官最怕你懂的Kafka面试题,一招致胜!

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 目录 一、前言Kafka的优点Kafka的使用场景…

密码学 | 椭圆曲线密码学 ECC 入门(二)

目录 4 椭圆曲线:更好的陷门函数 5 奇异的对称性 6 让我们变得奇特 ⚠️ 原文地址:A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography ⚠️ 写在前面:本文属搬运博客,自己留着学习。如果你和我一样…

实力认证!亚数产品入选《中国网络安全行业全景图(第十一版)》

2024年4月12日,安全牛第十一版《中国网络安全行业全景图》(以下简称“全景图”)正式发布。 亚数信息科技(上海)有限公司(以下简称“亚数”)成功入选数字证书、加解密、密钥管理三项细分领域。 此…

Linux 2.进程(守护进程)

守护进程 何谓守护进程常见守护进程进程查看命令pskill命令编写简单守护进程守护进程的父进程 何谓守护进程 daemon,表示守护进程,简称为d(进程名后面带d的基本就是守护进程) 长期运行(一般是开机运行直到关机时关闭&…

【Node.js从基础到高级运用】二十五、Node.js中Cluster的作用

引言 Node.js中的cluster模块允许您轻松创建共享服务器端口的子进程。这是一个核心模块,用于在Node.js应用程序中实现多进程架构,以充分利用多核CPU系统的计算能力。 cluster介绍 当您启动一个Node.js应用程序时,默认情况下它运行在单个进程…

【Python】什么是pip,conda,pycharm,jupyter notebook?conda基本教程

pip--conda--pycharm--jupyter notebook 🍃pip🍃conda🍃Pycharm🍃jupyter notebook🍃Conda基本教程☘️进入base环境☘️创建一个新的环境☘️激活环境☘️退出环境☘️查看电脑上都安装了哪些环境☘️删除已创建的项目…

Mac 部署 GPT-2 预训练模型 gpt2-chinese-cluecorpussmall

文章目录 下载 GPT-2 模型快速开始 GPT-2 下载 GPT-2 模型 https://huggingface.co/uer/gpt2-chinese-cluecorpussmall git clone https://huggingface.co/uer/gpt2-chinese-cluecorpussmall # 或单独下载 LFS GIT_LFS_SKIP_SMUDGE1 git clone https://huggingface.co/uer/gpt…

使用Docker,【快速】搭建个人博客【WordPress】

目录 1.安装Mysql,创建(WordPress)用的数据库 1.1.安装 1.2.创建数据库 2.安装Docker 3.安装WodPress(使用Docker) 3.1.创建文件夹 3.2.查看镜像 3.3.获取镜像 3.4.查看我的镜像 3.5.使用下载的镜像&#xf…

Linux的学习之路:11、地址空间

摘要 本章主要是说一下地址空间,我也只是按照我的理解进行解释,可能说不清楚,欢迎指正 目录 摘要 一、空间布局图 二、代码测试一下 三、进程地址空间 四、测试代码 一、空间布局图 如下方图片可以看出地址空间有几种,这里…

Arduino源代码(ino)在Proteus中调试总结

一、前言 基于BluePill Plus开发板(该板是毕设网红板) BluePill Plus / WeAct Studio 微行工作室 出品 BluePill-Plus/README-zh.md at master WeActStudio/BluePill-Plus GitHub 首页-WeAct Studio-淘宝网 (taobao.com) 在Proteus中对应的例子是&…

每日OJ题_多源BFS①_力扣542. 01 矩阵(多源BFS解决最短路原理)

目录 多源BFS解决最短路算法原理 力扣542. 01 矩阵 解析代码 多源BFS解决最短路算法原理 什么是单源最短路 / 多源最短路? 之前的BFS解决最短路都是解决的单源最短路。 画图来说,单源最短路问题即为: 而对于多源最短路问题: 如何解决此…

Docker容器逃逸-特权模式-危险挂载-Procfs

Docker容器逃逸-特权模式-危险挂载 Docker这个概念: Docker 容器与虚拟机类似,但二者在原理上不同,容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 ‍ Docker会遇到的安…

京东微服务microApp使用总结

前言 基于现有业务门户进行微服务基础平台搭建 主应用框架:vue3vite 子应用框架:vue2webpack / vue3vite在这里插入代码片 本地调试即可:主应用子应用进行打通(注意:两者都是vue3vite) 问题总结 1.嵌入…

压电式微机械超声换能器(PMUT)可替代传统超声换能器 下游应用范围广泛

压电式微机械超声换能器(PMUT)可替代传统超声换能器 下游应用范围广泛 压电式微机械超声换能器(PMUT),是一种基于正逆压电效应与微机械(MEMS)技术制造而成的发射、接收超声波以实现检测的装置。…

个人开发 App 最简单方法:使用现代开发工具和平台

在移动应用市场的蓬勃发展下,个人开发者也有机会将自己的创意转化为实际的应用程序,并通过应用商店实现盈利。然而,对于许多初学者来说,如何开始个人开发一个应用可能会感到困惑。本文将介绍个人开发 App 的最简单方法&#xff0c…

Zynq7000系列中的IOP模块时钟使用

IOP模块的时钟(用于内部控制器逻辑)可以由时钟子系统生成,或者在某些情况下,由IOP的外部接口生成。在所有情况下,IOP的控制和状态寄存器都是由其AMBA接口时钟(CPU_1x)驱动的。有时,C…

ESA SNAP更新失败

snap用起来真是一言难尽,老师原话:很拉,不更新进行处理又会报错(本科的时候就已经体验过了),但是更新又会发现老是失败,just pop up a window: try again later、unable to connect to update c…

️️️Vue3+Element-Plus二次封装一个可定制化的table组件

前言 为什么需要二次封装 开发后台管理系统,会接触到很多表格和表单,一但表格表单多起来,仅仅只需要一小部分改变,都需要在中重写一大堆代码,许多重复逻辑,我们可以把重复逻辑抽离出来二次封装一个组件 使用,减少在开发中需要编写的代码。 为什么需要定制化 每个…

前端请求404,后端保无此方法

1、微信小程序前端路径404 2、后端报无此路径 3、查看路径下对应的方法 发现忘了在list方法前加GetMapping(“/list”),加上即可