【数据结构(邓俊辉)学习笔记】二叉树04——Huffman树
文章目录
- 0. 概述
- 1. 无前缀冲突编码
- 2. 编码成本
- 3. 带权编码成本
- 4. 编码算法
- 5. 算法实现流程
- 6. 时间复杂度与改进方案
0. 概述
学习Huffman树。
1. 无前缀冲突编码

在加载到信道上之前,信息被转换为二进制形式的过程称作编码(encoding);反之,经信道抵达目标后再由二进制编码恢复原始信息的过程称作解码(decoding)。
编码和解码的任务分别由发送方和接收方分别独立完成,故在开始通讯之前,双方应已经以某种形式,就编码规则达成过共同的约定或协议。
解码策略——前缀无歧义编码PFC(prefix-free code):按顺序对信息比特流做子串匹配的策略,因此为消除匹配的歧义性,任何两个原始字符所对应的二进制编码串,相互都不得是前缀。

利用二叉编码树方法可解决消息解码歧义问题,可以使通讯双方交换信息,进行沟通。
2. 编码成本
接下来讨论新的问题——如何使编码更有效? 首先来看如何对编码长度做“度量”。

字符x的编码长度|rps(x)|就是其对应叶节点的深度depth(v(x))。

上图都是对四个字符MAIN同一编码表的三种编码方式——左中右。它们的编码长度是不一样的,发送MAIN单词,左边占9bit,中间占8bit,右边占9bit,中间的编码长度相对较优,需要这么较劲吗?会影响到带宽、费用、成本和用户体验。
问题关键点——怎么才能编程最优编码方式呢?
通过观察不难得出,树结构越平衡越好——杜绝树中节点深度差过大(大于等于2)。再接着问,如何让树变的平衡呢?
结论:
- 最优二叉编码树必为真二叉树:内部节点的左、右孩子全双。
- 最优编码树中,叶节点位置的选取有严格限制——其深度之差不得超过1。
叶子只能出现在倒数两层内——否则,通过节点交换可以。
3. 带权编码成本

以上最优编码树算法的实际应用价值并不大,除非中各字符在文本串中出现的次数相等。因此需面对一个事实——词频差异很大,这种情况下,完全树未必就是最优编码树,如上图,应该从另一角度更为准确地衡量平均编码长度。

总结:让频率更高的字符放在树高处,让频率更低的字符放在树的低处。
4. 编码算法

结论:尽管贪心策略未必总能得到最优解,但非常幸运,如上算法的确能够得到最优编码树之一。
5. 算法实现流程
- 总体框架

- 最小超字符

- 构造编码表

6. 时间复杂度与改进方案


相关文章:
【数据结构(邓俊辉)学习笔记】二叉树04——Huffman树
文章目录 0. 概述1. 无前缀冲突编码2. 编码成本3. 带权编码成本4. 编码算法5. 算法实现流程6. 时间复杂度与改进方案 0. 概述 学习Huffman树。 1. 无前缀冲突编码 在加载到信道上之前,信息被转换为二进制形式的过程称作编码(encoding)&…...
arcgisPro将一个图层的要素复制到另一个图层
1、打开两个图层,如下,其中一个图层中有两个要素,需要将其中一个要素复制到另一个图层中,展示如下: 2、选中待复制要素,点击复制按钮,如下: 3、下拉粘贴按钮列表,选择【选…...
难兄难弟——Java中 goto 与 const关键字
目录 简洁版: 详解版: 一:goto 二:const 简洁版: 1: 在Java中,goto也是一个关键字,但是取消了goto的使用,使用循环标记进行代替; 2:在Java中&a…...
如何优化大文件读取时的性能
1、分块读取 1、不要一次性将整个文件加载到内存中,而是将其分割成多个较小的块(例如,每块1MB或更大),然后逐块读取和处理。 2、使用FileInputStream和BufferedInputStream来分块读取文件。 2、使用缓冲区 1、使用…...
【机器学习】Chameleon多模态模型探究
Chameleon:引领多模态模型的新时代 一、多模态模型的时代背景二、Chameleon模型的介绍三、Chameleon模型的技术特点四、Chameleon模型的性能评估五、Chameleon模型的代码实例 随着人工智能技术的深入发展,我们逐渐认识到单一模态的模型在处理复杂问题时存…...
cv2.imdecode 和 cv2.imread 的区别
cv2.imdecode 和 cv2.imread 都是 OpenCV 用于读取图像的函数,但它们用于不同的场景,处理方式也不同。 cv2.imread 用法: img cv2.imread(image_path)功能: cv2.imread 用于直接从文件系统中读取图像文件。image_path 是图像文件…...
Android数据缓存框架 - 内存数据载体从LiveData到StateFlow
引言:所有成功者的背后,都有一份艰苦的历程,不要只看到了人前的风光,而低估了他们背后所付出的努力。 随着flow到流行度越来越高,有开发者呼吁我使用flow,于是我就如你们所愿,新增了StateFlow作…...
多态的好处
使用多态(Polymorphism)在C中有多个重要的原因,这些原因使得多态成为面向对象编程中不可或缺的一部分。以下是使用多态的一些关键原因: 代码复用和灵活性: 多态允许我们编写可以处理多种类型对象的通用代码。通过使用…...
Java基础语法---Stringjoiner
Stringjoiner 使用需要加入 import java.util.StringJoiner 构造方法: StringJoiner(CharSequence delimiter) 创建一个 StringJoiner 实例,使用指定的分隔符,前缀和后缀默认为空字符串。 StringJoiner(CharSequence delimiter, CharSequence prefix, C…...
大模型中的Tokenizer
在使用GPT 、BERT模型输入词语常常会先进行tokenize 。 tokenize的目标是把输入的文本流,切分成一个个子串,每个子串相对有完整的语义,便于学习embedding表达和后续模型的使用。 一、粒度 三种粒度:word/subword/char word词&a…...
Filebeat进阶指南:核心架构与功能组件的深度剖析
🐇明明跟你说过:个人主页 🏅个人专栏:《洞察之眼:ELK监控与可视化》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是ELK 2、FileBeat在ELK中的角色 二、Fil…...
深度神经网络
深度神经网络(Deep Neural Networks,DNNs)是机器学习领域中的一项关键技术,它基于人工神经网络的概念,通过构建多层结构来模拟人脑的学习过程。以下是关于深度神经网络的清晰回答: 一、定义与特点 深度神…...
c++【入门】你多大了
时间限制 : 1 秒 内存限制 : 128 MB 一天玩仔跑来问周周你多大了,周周告诉他自己 1010 岁了,玩仔又说自己也是,你听到了这个对话,想用程序显示出两个人的对话内容,现在就来试一试吧。 输入 无 输出 输出三行&…...
地质考察AR远程交互展示系统辅助老师日常授课
广东这片充满活力的土地,孕育了一家引领ARVR科技潮流的杰出企业——深圳华锐视点,作为一家专注于VR/AR技术研究与业务开发的先锋公司。多年来,我们不断突破技术壁垒,将AR增强现实技术与各行各业的实际需求完美结合,助力…...
容器是什么
什么是容器? 容器技术近年来在软件开发和部署中变得越来越重要,尤其是在云计算和微服务架构中。本文将详细介绍什么是容器、其工作原理、优势以及常见的容器技术。 容器的定义 容器是一种轻量级、可移植的虚拟化技术,它允许在一个主机操作…...
一分钟学习数据安全——数字身份的三种模式
微软首席身份架构师金卡梅隆曾说:互联网的构建缺少一个身份层。互联网的构建方式让你无法得知所连接的人和物是什么。这限制了我们对互联网的使用,并让我们面临越来越多的危险。如果我们坐视不管,将面临迅速激增的盗窃和欺诈事件,…...
WPF实现搜索文本高亮
WPF实现搜索文本高亮 1、使用自定义的TextBlock public class HighlightTextblock : TextBlock{public string DefaultText { get; set; }public string HiText{get { return (string)GetValue(HiTextProperty); }set { SetValue(HiTextProperty, value); }}// Using a Depend…...
Vue小程序项目知识积累(三)
1.CSS中的var( ) var() 函数用于插入自定义属性(也称为CSS变量)的值。 var(--main-bg-color,20rpx) 设置一个CSS变量的值,但是如果 --main-bg-color 变量不存在,它将默认返回 20rpx。 CSS变量必须在一个有效的CSS规则…...
React Native 之 像素比例(十七)
在 React Native 中,PixelRatio 是一个用于获取设备像素比(Pixel Ratio)的实用工具。像素比(或称为设备像素密度、DPI 密度等)是物理像素和设备独立像素(DIPs 或 DPs)之间的比率。设备独立像素是…...
Leetcode 112:路径总和
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。 思路:遍历存储每条路径。当前节点为叶子节点时,求和。并判断是否等于目标…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
