当前位置: 首页 > news >正文

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

        已知字符集{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

相关文章:

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

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

Django项目中高效管理和使用选择常量

引言 在开发Django项目时,我们经常需要处理各种选择字段,比如用户类型、订单状态或产品分类等。如何有效地管理这些选择常量,使其在整个项目中保持一致性,同时又易于维护和更新呢?本文将介绍一种在Django项目中集中管理和使用选择常量的方法。 正文 © ivwdcwso (I…...

拦截器(Interceptor)的使用

在Java Web开发中,拦截器(Interceptor)是一种动态拦截请求和响应的对象,它可以在请求被控制器处理之前和之后执行一些预处理和后处理逻辑。要定义一个拦截器并使其生效,通常需要以下几个步骤: 1. 定义拦截…...

线段树例题题解

卫星覆盖(NOI1997) 题面: SERCOI(Space-Earth Resource Cover-Observe lnstitute) 是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星 -SERCOI-308。这种卫星可以…...

AI提示词工程的“优化背后”:如何通过精准提示提升模型性能?

提示词工程(Prompt Engineering)已经成为推动AI模型如GPT等发挥其强大能力的核心。AI模型的输出质量与输入的提示词密切相关。因为之前已经大致用过一段时间提示词,所以这篇文章集中在有一定基础,起码对提示词不陌生,想要去设计和优化提示词+处理复杂问题的时候不知道如何…...

c# Record关键字

在 C# 9.0 中引入了 record 关键字,用于定义记录类型(Record Types)。记录类型是一种轻量级的数据载体,专注于表示数据,它提供了内置的相等性比较、生成属性和方法等功能,使得编写数据类更加简洁和高效。 …...

高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程

前言 Nginx WebUI 是一个为 Nginx 提供图形化管理界面的工具。通过 WebUI,用户可以轻松管理 Nginx 配置,而无需直接编辑配置文件,尤其适合新手用户和频繁修改配置的场景。 官网文档:nginxWebUI - 文档 本文将分享为什么选择 ngin…...

家政预约小程序04活动管理表结构设计

目录 1 创建活动表2 创建活动规则表3 创建活动参与记录表总结 为了满足我们日常的营销,我们通常需要搞一些活动,比如满减、折扣、团购等。启动活动后,会在首页进行显示,当用户访问小程序的时候,就可以参与活动&#xf…...

谷歌浏览器的在线存储功能使用方法

谷歌浏览器不仅是目前全球使用最广泛的网络浏览器之一,它还集成了许多实用的功能来提升用户体验。其中,谷歌浏览器的在线存储功能允许用户将数据保存在云端,实现跨设备的无缝同步和共享。本文将详细介绍如何在谷歌浏览器中使用这一功能。 一、…...

HT-HaiBOX边缘计算盒 智慧工厂方案,智慧医疗方案,智慧加油站方案,智慧安防方案,智慧城市方案;方案定制开发

背景介绍 在当今数字化时代,各个行业对于智能化视频监控设备的需求日益增长。无论是安防监控,还是智慧工厂、智慧城市等领域,都需要高效、智能的设备来保障安全和提高生产效率。然而,传统的视频监控设备存在诸多痛点:…...

回调机制实现观察者模式

观察者设计模式,允许对象在状态变化时通知其他依赖对象,通常通过回调函数实现。 在回调机制中,可以注册多个回调函数,以便在特定事件发生时依次调用它们。下面是一个示例,展示如何在 C 中实现一个简单的事件管理器&am…...

并发编程系列(一) -多线程技术快速入门

最近对 Java 并发编程技术知识进行了重新整理,再次献上文章合集索引,感兴趣的小伙伴可以直接点击如下地址快速阅读。 并发编程系列(一) -多线程技术快速入门并发编程系列(二) -Thread类介绍并发编程系列(三) -synchronized关键字介绍并发编程系列(四) -v…...

单元测试入门和mockup

Java 新手入门:Java单元测试利器,Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式,学一下单测思路 这个没有动态代理,所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…...

蓝桥杯(Java)(ing)

Java前置知识 输入流: (在Java面向对象编程-CSDN博客里面有提过相关知识------IO流) // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new…...

【Linux-多线程】线程互斥(锁和它的接口等)

一、线程互斥 我们把多个线程能够看到的资源叫做共享资源,我们对共享资源进行保护,就是互斥 1.多线程访问问题 【示例】见一见多线程访问问题,下面是一个抢票的代码,共计票数10000张,4个线程去抢 之前我们展示过封…...

[江科大STM32] 第五集快速建立STM32工程模板——笔记

保存,进去选芯片型号,我们是F10C8T6 一个MD,还有所有.c.h 这里所有文件 这里所有文件...

流水线并行举例说明;GPU 的细粒度问题

GPU 的细粒度与模型并行和流水线并行关系 使用模型并行和流水线并行之后会涉及到一个模型切分细粒度的问题,先切分多头(并行执行),每一个多头在切分不同阶段(串行执行)。这种情况下GPU的细粒度是多少 在这种模型并行和流水线并行结合且按多头和阶段切分的情况下,GPU 的…...

如何确保Kafka集群的高可用?

大家好,我是锋哥。今天分享关于【如何确保Kafka集群的高可用?】面试题。希望对大家有帮助; 如何确保Kafka集群的高可用? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 要确保 Kafka 集群 的高可用性,需要…...

计算机毕业设计Python+Spark考研预测系统 考研推荐系统 考研数据分析 考研大数据 大数据毕业设计 大数据毕设

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

Oracle SqlPlus常用命令简介

参考资料 【SQL*Plus】SETシステム変数の設定前後の具体例 目录 一. 执行系命令1.1 执行系统命令1.2 执行sql脚本文件1.2.1 在数据库中执行sql脚本1.2.2 通过sqlplus执行sql脚本 二. show命令2.1 显示SqlPlus中的全部环境变量2.2 显示指定环境变量的设置 三. 时间显示3.1 set …...

8.若依系统监控与定时任务

帮助开发者和运维快速了解应用程序的性能状态。 数据监控 定时任务 实现动态管理任务。 需求:每间隔5s,控制台输出系统时间。 新建的任务类必须在指定目录ruoyi-quartz模块下的task包下。 状态设置为启动 执行策略 场景:比如一个任务每个…...

《计算机组成及汇编语言原理》阅读笔记:p160-p176

《计算机组成及汇编语言原理》学习第 12 天,p160-p176 总结,总计 17 页。 一、技术总结 1.PowerPC (1)programming model(mode) As in most modern computers, there are at least two separate views of the system (formally called programming m…...

TCP网络编程(三)—— 客户端的编写/服务器端和客户端的通信

上篇文章我们学习了TCP的服务器端模式的编写,这篇文章我们将开始编写客户端的代码,完成服务器端和客户端的通信。完整代码和演示在文章的后面。 和服务器端不同,在客户端我们只需要服务器端的套接字和服务器端的地址和端口,用于向…...

如何在谷歌浏览器中使用自定义模板

作为最常用的网络浏览器之一,谷歌浏览器不仅提供了强大的功能,还允许用户通过各种方式自定义其外观和功能。其中,使用自定义模板可以极大地提升用户体验,无论是更改浏览器的外观还是优化网页显示效果。本文将详细介绍如何在谷歌浏…...

Day2 微服务 网关路由转发、网关登录校验、配置管理

目录 1.网关路由转发 1.1 网关 1.2 快速入门 1.2.1 创建项目 1.2.2 引入依赖 1.2.3 启动类 1.2.4 配置路由 1.2.5 测试 1.3 路由过滤 2.网关登录校验 2.1 鉴权思路分析 2.2 网关过滤器 2.3 自定义过滤器 2.3.1 自定义GatewayFilter 2.3.2 自定义GlobalFilter 2.4 登录校验 2.4.…...

Android 旋转盘导航栏

1.直接上源码: package com.you.arc;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.graphics.RectF; import android.support…...

空域降噪、频域降噪和时域降噪

目录 算法原理: 1.图像噪声 2.图像中常见的噪声的类型 3.不同域的定义 4.空域降噪 4.1.空域降噪的定义: 4.2.思想核心: 4.3.局部的线性算法 高斯降噪 4.4.非局部算法 5.频域降噪 傅里叶降噪: 小波降噪: …...

Cornerstone3D:了解Nifti文件,并查看元数据

Nifti 全称Neuroimaging Informatics Technology Initiative是一种专为存储医学和神经影像数据而设计的文件格式。设计目的是高效的存储三维或四维图像数据,同时将相关的元数据紧凑地嵌入文件中。Nifti文件的组成:头信息(元数据)…...

设计模式の状态策略责任链模式

文章目录 前言一、状态模式二、策略模式三、责任链模式 前言 本篇是关于设计模式中的状态模式、策略模式、以及责任链模式的学习笔记。 一、状态模式 状态模式是一种行为设计模式,核心思想在于,使某个对象在其内部状态改变时,改变该对象的行为…...

DevOps流程CICD之Jenkins使用操作

一、jenkins的docker-compose安装部署 请参考 jenkins的docker安装部署配置全网最详细教程-CSDN博客 二、创建repository 三、创建ssh 四、创建视图 五、创建任务 六、配置gitlab钩子 七、自动构建部署CI/CD验证...