哈夫曼编码(Huffman Coding)与哈夫曼树(Huffman Tree)

news2025/1/4 3:50:07

        已知字符集{a,b,c,d,e,f},若各字符出现的次数分别为6,3,8,2,10,4,则对应字符集中各字符的哈夫曼编码可能是(        )。

A.00,1011,01,1010,11,100                   B.00,100,110,000,0010,01

C.10,1011,11,0011,00,010                   D.0011,10,11,0010,01,000


看到此题,首先我们需要了解什么是哈夫曼编码与哈夫曼树?


哈夫曼编码(Huffman Coding)

  1. 哈夫曼在1952年设计了一种算法,即利用字符频率来构造最优前缀码的编码方法,称为哈夫曼编码。
    1. 该编码方法一般设置在哈夫曼树中,从根节点到每个叶子节点的路径上,标记左分支的权值为0,标记右分支的权值为1,则从根结点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符的编码(即每个叶子节点都会有一个唯一的二进制编码),这就是哈夫曼编码。
  2. 一般应用于数据的解压和压缩。其核心思想是通过构建哈弗曼树,为常用字符分配较短的编码,不常用的字符分配较长的编码,从而减少数据的总体存储空间以及传输成本。 不会丢失信息,能够保持原始数据完整性。但构建哈夫曼树和生成编码的过程相对复杂,一般在应用时也无法实时地快速处理。
  3. 可以根据数据出现的频率来构建二叉树 。      
  4. 哈夫曼编码是前缀编码,各个编码的前缀各不相同,因此直接拿编码序列与哈夫曼编码一比对即可
    1. 前缀编码 

      1. 任一字符的编码都不是另一个字符的编码的前缀,不会因为编码的长短不等而让人产生混淆,这就是前缀编码。
  5. 哈夫曼编码构造过程

    1. 首先统计每个字符在数据中出现的频率,将每个字符的频率视为树的权值。
    2. 先把有权值的叶子结点按照从小到大的顺序进行排列,形成一个有序序列。
    3. 每次选择两个权值最小的树(即出现频率最低的两个节点,相对较小的是左孩子)合并为一棵新的二叉树,新树的权值为两个子树权值之和。(即令N为这两棵树的父结点,N节点的出现频率等于这两棵树出现频率的总和)。

    4. 去掉步骤3的两个节点,将父结点N加入步骤2,重新进行计算。

    5. 重复上述过程,直到只剩下一棵树为止,即最终会形成一个根结点。此时便完成了哈夫曼树的构造。

    6. 根据构建好的哈夫曼树,从根节点到每个叶子节点的路径上,左分支标记为0,右分支标记为1,从而得到每个字符的哈夫曼编码。

               


哈夫曼树‌【优化二叉树】(Huffman Tree)

  1. 哈夫曼在编码中用到的特殊二叉树称为哈夫曼树。
    1. 同样,我们在解码的时候还是要用到哈夫曼树。
  2. 树结点间的边相关的数叫做权。
  3. 树的构建基于字符的出现频率,频率高的字符对应的节点更接近树的根结点,频率低的字符对应的节点更远离树的根结点。‌
  4. 【路径长度】为从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目。
  5. 【树的路径长度】为树根到每一结点的路径长度之和。
  6. 【结点带权的路径长度】为从该结点到树根之间的路径长度与结点上权的乘积。
  7. 【树的带权路径长度(WPL)】为树中所有叶子结点的带权路径长度之和。
    1. 哈夫曼树是一种最优二叉树,其带权路径长度最短。

                        

回看此题:

        已知字符集{a,b,c,d,e,f},若各字符出现的次数分别为6,3,8,2,10,4,则对应字符集中各字符的哈夫曼编码可能是(        )。

A.00,1011,01,1010,11,100                   B.00,100,110,000,0010,01

C.10,1011,11,0011,00,010                   D.0011,10,11,0010,01,000

因为各字符出现的次数分别为6,3,8,2,10,4,所以根据上面讲到的哈夫曼编码构造过程第2步,先把有权值的叶子结点按照从小到大的顺序进行排列,形成一个有序序列,即:

2,3,4,6,8,10

根据第3步所讲,每次选择两个权值最小的树(即出现频率最低的两个节点,相对较小的是左孩子)合并为一棵新的二叉树,新树的权值为两个子树权值之和。(即令N为这两棵树的父结点,N节点的出现频率等于这两棵树出现频率的总和),即:

2和3为出现频率最低的两个节点,2相对较小,是左孩子,N为2+3=5,即N=5

画图为:

将N加入步骤2,重新进行计算,即:

4,5,6,8,10

根据第3步所讲,即:

4和5为出现频率最低的两个节点,4相对较小,是左孩子,父结点为4+5=9,即N=9

将父结点加入步骤2,重新进行计算,即:

6,8,9,10

根据第5步所讲,重复上述过程,直到只剩下一棵树为止,即最终会形成一个根结点。此时便完成了哈夫曼树的构造,即:

9,10,14

14,19

33

 

根据字符集为{a,b,c,d,e,f},各字符出现的次数分别为6,3,8,2,10,4,所以将上面画好的图替换回来,即:

再根据第6步所讲,根据构建好的哈夫曼树,从根节点到每个叶子节点的路径上,左分支标记为0,右分支标记为1,从而得到每个字符的哈夫曼编码,即:

列表为:

abcdef
00101101101011100

故得到的哈夫曼编码为00,1011,01,1010,11,100

选项:

A.00,1011,01,1010,11,100                   B.00,100,110,000,0010,01

C.10,1011,11,0011,00,010                   D.0011,10,11,0010,01,000

故选A

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

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

相关文章

Eureka 介绍与原理详解

在微服务架构中,服务发现(Service Discovery)是一个至关重要的组件。随着服务数量的增加,手动管理服务的地址和端口变得不切实际。Eureka 是 Netflix 开源的一款服务发现工具,旨在解决微服务架构中的服务注册与发现问题…

C++和OpenGL实现3D游戏编程【连载19】——着色器光照初步(平行光和光照贴图)(附源码)

1、本节要实现的内容 我们在前期的教程中,讨论了在即时渲染模式下的光照内容。但在我们后期使用着色器的核心模式下,会经常在着色器中使光照,我们这里就讨论一下着色器光照效果,以及光照贴图效果,同时这里知识会为后期的更多光照效果做一些铺垫。本节我们首先讨论冯氏光照…

RedisDesktopManager新版本不再支持SSH连接远程redis后

背景 RedisDesktopManager(又名RDM)是一个用于Windows、Linux和MacOS的快速开源Redis数据库管理应用程序。这几天从新下载RedisDesktopManager最新版本,结果发现新版本开始不支持SSH连接远程redis了。 解决方案 第一种 根据网上有效的信息,可以回退版…

【图像处理lec10】图像压缩

目录 一、图像压缩基础 1、图像压缩的基本概念 2、数据冗余与压缩比 3、三种主要的数据冗余类型 4、保真度评估标准(Fidelity Criteria) 5、应用与实践 二、图像压缩模型 1、图像压缩模型概述 (1)压缩系统的结构 &#…

Python-网络爬虫

随着网络的迅速发展,如何有效地提取并利用信息已经成为一个巨大的挑战。为了更高效地获取指定信息,需定向抓取并分析网页资源,从而促进了网络爬虫的发展。本章将介绍使用Python编写网络爬虫的方法。 学习目标: 理解网络爬虫的基本…

curl+openssl 踩坑笔记

curl编译:点击跳转 踩坑一 * SSL certificate problem: unable to get local issuer certificate * closing connection #0 curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: https://curl.se/docs/sslcerts.html …

mysql-二进制安装方式

目录 1. 安装组件即依赖包 2. 创建用户 3. 关闭防火墙 4. 解压mysql二进制源码包 5. 创建文件夹并赋予权限 6. 编译安装mysql,安装完成最后面,会有一串英文,那是登录数据库的密码 7. 设置配置文件 8. 将mysql添加进环境变量 9. 复制…

【MySQL】深度学习数据库开发技术:使用CC++语言访问数据库

**前言:**本节内容介绍使用C/C访问数据库, 包括对数据库的增删查改操作。 主要是学习一些接口的调用, 废话不多说, 开始我们的学习吧! ps:本节内容比较容易, 友友们放心观看哦! 目录 准备mysql…

Vscode左大括号不另起一行、注释自动换行

参考大佬的博客VSCode 格式化 cpp 文件时配置左大括号不换行_vscode大括号不换行-CSDN博客 Clang_format_style {BasedOnStyle: Chromium, IndentWidth: 4}

1、Jmeter、jdk下载与安装

1、访问官网,点击下载Jmeter http://jmeter.apache.org/ 2、在等待期间,下载对应的Java https://www.oracle.com/cn/java/technologies/downloads/#jdk23-windows 3、全部下载好,先安装JDK ![在这里插入图片描述](https://i-blog.csdnimg…

【Vim Masterclass 笔记02】第3章:Vim 核心知识 + L08:Vim 核心浏览命令 + L09:Vim 核心浏览命令同步练习

文章目录 Section 3:Vim Essentials(Vim 核心知识)S03L08 Essential Navigation Commands1 光标的上下左右移动2 上 / 下翻页3 基于单词前移4 基于单词后移5 重新定位视图中的文本(页面重绘)6 定位到所在行的行首7 光标…

docker学习记录-部署若依springcloud项目

使用docker compse部署RuoYi v3.6.4 一、打包代码 Java代码 打包前需要将127.0.0.1改成宿主机ip, 使用docker部署的nacos,应该是要改成ruoyi-nacos(docker中的服务容器名)。 使用idea window系统可能没有sh命令,不能…

Unity 实现Canvas显示3D物体

新建一个UI相机,选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体,并将3D物体的层级设置为UI层 适当的放缩3DObjParent,让3D物体能显示出来…

【spring】参数校验Validation

前言 在实际开发中,我们无法保证客户端传来的请求都是合法的。比如一些要求必传的参数没有传递,传来的参数长度不符合要求等,这种时候如果放任不管,继续执行后续业务逻辑,很有可能就会出现意想不到的bug。 有人可能会…

STM32 SPI读取SD卡

七个响应类型: R1 Response (Normal Response): R1响应是最基本的响应,包含一个字节的状态位,用于指示命令是否成功执行。常用。最高位为0。最低位为1表示是空闲状态。其他位是各种错误提示。 R1b Response (Normal with Busy): 类似于R1&a…

【Solidity】入门指南:智能合约开发基础

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Solidity入门指南:智能合约开发基础引言1. 开发环境搭建1.1 Remix I…

EasyExcel(读取操作和填充操作)

文章目录 1.准备Read.xlsx(具有两个sheet)2.读取第一个sheet中的数据1.模板2.方法3.结果 3.读取所有sheet中的数据1.模板2.方法3.结果 EasyExcel填充1.简单填充1.准备 Fill01.xlsx2.无模版3.方法4.结果 2.列表填充1.准备 Fill02.xlsx2.模板3.方法4.结果 …

OCR实践-问卷表格统计

前言 书接上文 OCR实践—PaddleOCROCR实践-Table-Transformer 本项目代码已开源 放在 Github上,欢迎参考使用,Star https://github.com/caibucai22/TableAnalysisTool 主要功能说明:对手动拍照的问卷图片进行统计分数(对应分数…

BOE(京东方)“向新2025”年终媒体智享会落地深圳

12月27日,BOE(京东方)“向新 2025”年终媒体智享会的收官之站在创新之都深圳圆满举行,为这场为期两周、横跨三地的年度科技盛会画上了完美句号。活动期间,全面回顾了 BOE(京东方)2024年在多个关键领域取得的卓越成绩,深入剖析其在六大维度构建的“向新”发展格局,精彩呈现了以“…

Kinova在开源家庭服务机器人TidyBot++研究里大展身手

在科技日新月异的今天,机器人技术在家庭场景中的应用逐渐成为现实,改变着我们的生活方式。今天,我们将深入探讨一篇关于家用机器人研究的论文,剖析其中的创新成果, 论文引用链接:http://tidybot2.github.i…