数据结构:哈夫曼树
1.概念
哈夫曼树(Huffman Tree)是一种用于数据压缩的二叉树,由大卫·哈夫曼(David A. Huffman)于1952年提出。它通过构建最优二叉树来实现数据的高效压缩,广泛应用于文件压缩、图像压缩等领域。
哈夫曼树的核心思想
哈夫曼树的核心思想是用较短的编码表示出现频率较高的字符,用较长的编码表示出现频率较低的字符,从而减少整体的编码长度。
2.构建哈夫曼树的步骤
-
统计字符频率:
-
统计待压缩数据中每个字符出现的频率。
-
-
创建节点:
-
为每个字符创建一个节点,节点的权重为字符的频率。
-
-
构建优先队列:
-
将所有节点放入一个优先队列(最小堆),按权重从小到大排序。
-
-
合并节点:
-
从优先队列中取出权重最小的两个节点,合并成一个新节点,新节点的权重为这两个节点的权重之和。
-
将新节点放回优先队列。
-
-
重复合并:
-
重复上述步骤,直到优先队列中只剩一个节点,这个节点就是哈夫曼树的根节点。
-
-
生成编码:
-
从根节点开始,向左子树走标记为0,向右子树走标记为1,直到叶子节点,得到每个字符的哈夫曼编码。
-
3.哈夫曼树的特点
-
最优前缀编码:哈夫曼编码是一种前缀编码,没有任何一个编码是另一个编码的前缀。
-
最小加权路径长度:哈夫曼树的带权路径长度(WPL)最小,即压缩效率最高。
示例
假设有以下字符及其频率:
-
A: 5
-
B: 9
-
C: 12
-
D: 13
-
E: 16
-
F: 45
构建哈夫曼树的过程:
-
将所有字符节点放入优先队列。
-
取出A(5)和B(9),合并为新节点(14),放回队列。
-
取出C(12)和D(13),合并为新节点(25),放回队列。
-
取出E(16)和新节点(14),合并为新节点(30),放回队列。
-
取出新节点(25)和F(45),合并为新节点(70),放回队列。
-
取出新节点(30)和新节点(70),合并为根节点(100)。
根据哈夫曼树的构建规则和正确的路径长度过程:
(100)/ \(30) (70)/ \ / \
(14) E(16) (25) F(45)/ \ / \
A(5) B(9) C(12) D(13)
路径长度:
-
A:根 → 30 → 14 → A,路径长度 3。
-
B:根 → 30 → 14 → B,路径长度 3。
-
C:根 → 70 → 25 → C,路径长度 3。
-
D:根 → 70 → 25 → D,路径长度 3。
-
E:根 → 30 → E,路径长度 2。
-
F:根 → 70 → F,路径长度 2。
计算 WPL
| 字符 | 权重(频率) | 路径长度 | 权重 × 路径长度 |
|---|---|---|---|
| A | 5 | 3 | 5×3=15 |
| B | 9 | 3 | 9×3=27 |
| C | 12 | 3 | 12×3=36 |
| D | 13 | 3 | 13×3=39 |
| E | 16 | 2 | 16×2=32 |
| F | 45 | 2 | 45×2=90 |
WPL 总和:
15+27+36+39+32+90=239
总结
路径长度是哈夫曼树中一个重要的概念,它直接决定了每个字符的编码长度。通过最小化带权路径长度(WPL),哈夫曼树能够实现数据的高效压缩。
相关文章:
数据结构:哈夫曼树
1.概念 哈夫曼树(Huffman Tree)是一种用于数据压缩的二叉树,由大卫哈夫曼(David A. Huffman)于1952年提出。它通过构建最优二叉树来实现数据的高效压缩,广泛应用于文件压缩、图像压缩等领域。 哈夫曼树的…...
第36天:安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入
时间轴: 演示案例: Java-三方组件-Log4J&JNDI Java-三方组件-FastJson&反射 Maven的下载及配置: IDEA配置Maven的超详细步骤_java_脚本之家 Java-三方组件-Log4J&JNDI JNDI 注入: ( 见图 ) Java Naming and Dire…...
21爬虫:使用playwright接管本地已经登录淘宝的浏览器并查找python相关店铺信息
1.playwright如何接管本地浏览器 (1)首先找到电脑上安装的Chrome浏览器可执行程序的完整路径: Mac电脑上可执行程序的完整路径为: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome windows系统的电脑上查找可执行…...
【C++】RBTree(红黑树)模拟实现
文章目录 1.红黑树的概念2.红黑树的性质3.红黑树的结点4.insert函数(插入结点)5.左旋、右旋6.总代码 后续有时间会增加erase 1.红黑树的概念 红黑树是一种自平衡的二叉搜索树。每个节点额外存储了一个 color 字段 (“RED” or “BLACK”), …...
Redis——优惠券秒杀问题(分布式id、一人多单超卖、乐悲锁、CAS、分布式锁、Redisson)
#想cry 好想cry 目录 1 全局唯一id 1.1 自增ID存在的问题 1.2 分布式ID的需求 1.3 分布式ID的实现方式 1.4 自定义分布式ID生成器(示例) 1.5 总结 2 优惠券秒杀接口实现 3 单体系统下一人多单超卖问题及解决方案 3.1 问题背景 3.2 超卖问题的…...
【现代深度学习技术】深度学习计算 | GPU
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
USB Flash闪存驱动器安全分析(第一部分)
翻译原文链接:Hacking Some More Secure USB Flash Drives (Part I) | SySS Tech Blog 文章翻译总结:文章对一些具有AES硬件加密的USB闪存驱动器的网络安全分析研究。研究由SySS的IT安全专家Matthias Deeg进行,他在2022年初发现了几个安全漏…...
3.1 严格Stubbing模式
严格Stubbing(Strict Stubbing)是Mockito提供的一种增强测试严谨性的模式,旨在检测以下问题: 多余的Stubbing:配置了未被调用的方法桩。不必要的Stubbing:Stubbing未被使用且不影响测试结果。桩顺序错误&a…...
【Linux】--- 基础开发工具之yum/apt、vim、gcc/g++的使用
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: Linux网络编程 本篇博客我们来认识一下Linux中的一些基础开发工具 --- yum,vim,gcc/g。 🏠 yum 🎸 什么是yum 当用户想下载软…...
Python + WhisperX:解锁语音识别的高效新姿势
大家好,我是烤鸭: 最近在尝试做视频的质量分析,打算利用asr针对声音判断是否有人声,以及识别出来的文本进行进一步操作。asr看了几个开源的,最终选择了openai的whisper,后来发现性能不行,又换了…...
redis 缓存击穿问题与解决方案
前言1. 什么是缓存击穿?2. 如何解决缓存击穿?怎么做?方案1: 定时刷新方案2: 自动续期方案3: 定时续期 如何选? 前言 当我们使用redis做缓存的时候,查询流程一般是先查询redis,如果redis未命中,再查询MySQL,将MySQL查询的数据同步到redis(回源),最后返回数据 流程图 为什…...
SAP HCM 批量核算工资报错如何定位错误 (SAT分析错误)
导读 簇目录 (表 RGDIR) 不包含任何记录:今天遇到一个很奇怪的问题,簇目录 (表 RGDIR) 不包含任何记录,而且出现的问题没有具体到员工编号,所以处理问题非常棘手。今天分享下我的处理方式,以便大家遇到这类的问题不知道如何下手。…...
常用共轭先验分布
内容来源 贝叶斯统计(第二版)中国统计出版社 正态分布的均值 总体分布 N ( θ , σ 2 ) N(\theta,\sigma^2) N(θ,σ2) 先验分布为正态分布 N ( μ , τ 2 ) N(\mu,\tau^2) N(μ,τ2) 样本 x i ( i 1 , 2 , ⋯ , n ) x_i(i1,2,\cdots,n) xi(i1…...
浅聊MQ之Kafka与RabbitMQ简用
(前记:内容有点多,先看目录再挑着看。) Kafka与RabbitMQ的使用举例 Kafka的使用举例 安装与启动: 从Apache Kafka官网下载Kafka中间件的运行脚本。解压后,通过命令行启动Zookeeper(Kafka的运行…...
服务器被暴力破解的一次小记录
1. 网络架构 家里三台主机,其他一台macmini 启用ollama运行大模型的服务,主机1用来部署一些常用的服务如:mysql, photoprism等,服务器作为网关部署docker, 并且和腾讯云做了内网穿透。服务器部署了1panel用来管理服务并且监控&…...
3. 导入官方dashboard
官方dashboard:https://grafana.com/grafana/dashboards 1. 点击仪表板 - 新建 - 导入 注:有网络的情况想可以使用ID,无网络情况下使用仪表板josn文件 2. 在官方dashboard网页上选择符合你现在数据源的dashboard - 点击进入 3. 下拉网页选…...
国家队出手!DeepSeek上线国家超算互联网平台!
目前,国家超算互联网平台已推出 DeepSeek – R1 模型的 1.5B、7B、8B、14B 版本,后续还会在近期更新 32B、70B 等版本。 DeepSeek太火爆了!在这个春节档,直接成了全民热议的话题。 DeepSeek也毫无悬念地干到了全球增速最快的AI应用。这几天,国内的云计算厂家都在支持Dee…...
第6章 6.4 ASP.NET Core Web API各种技术及选择
6.4.1 控制器父类用哪个 6.2小节和6.3小节所演示的ASP.NET Core Web API 的控制器类都继承自ControllerBase,而6.1中MVC的控制器继承自Controller,Controller又继承自ControllerBase。 所以,一般情况下,编写的WebAPI控制器类继承…...
python导入模块的方式
在python开发中,巧用模块导入可简化开发,提高开发效率。下面简介下模块使用使用事项: 一、模块的使用: 模块 就好⽐是 ⼯具包,要想使⽤这个⼯具包中的⼯具,就需要 使用import导⼊ 这个模块每⼀个以扩展名…...
【Linux】Ubuntu Linux 系统——Node.js 开发环境
ℹ️大家好,我是练小杰,今天星期五了,同时也是2025年的情人节,今晚又是一个人的举个爪子!! 🙂 本文是有关Linux 操作系统中 Node.js 开发环境基础知识,后续我将添加更多相关知识噢&a…...
使用pyCharm创建Django项目
使用pyCharm创建Django项目 1. 创建Django项目虚拟环境(最新版版本的Django) 使用pyCharm的创建项目功能,选择Django,直接创建。 2. 创建Django项目虚拟环境(安装特定版本) 2.1创建一个基础的python项目 2.2 安装指定版本的D…...
【前端框架】深入Vue 3组件开发:构建高效灵活的前端应用
一、引言 Vue 3作为一款流行的前端框架,其组件化系统是构建大型应用的核心。通过将应用拆分为多个可复用的组件,不仅能提高代码的可维护性与复用性,还能让开发团队进行高效的协作。本文将深入探讨Vue 3组件开发的各个方面,帮助开…...
基于Python flask-sqlalchemy的SQLServer数据库管理平台
适应场景: 主要用于帮助DBA自动化很多日常工作,包括: 数据库状态监控 性能问题诊断 日志分析 自动巡检 问题告警 系统截图: main.py from flask import Blueprint, render_template, request, flash, redirect, url_for f…...
npm运行Vue项目报错 error:0308010c:digital envelope routines::unsupported
大家好,我是 程序员码递夫。 问题 VSCode 运行Vue项目,提示错误: building 2/2 modules 0 activeError: error:0308010c:digital envelope routines::unsupported 解决方法 原因是 npm 高版本(大于17),对ssl的处理做了改进&…...
计数排序
目录 计数排序原理和步骤: 完整代码实现: 计数排序原理和步骤: 当一段数据比较集中在一个范围,比如 98,95,98,91,90,93,94,97,93&…...
MyBatis拦截器终极指南:从原理到企业级实战
在本篇文章中,我们将深入了解如何编写一个 MyBatis 拦截器,并通过一个示例来展示如何在执行数据库操作(如插入或更新)时,自动填充某些字段(例如 createdBy 和 updatedBy)信息。本文将详细讲解拦…...
Pythong 解决Pycharm 运行太慢
Pythong 解决Pycharm 运行太慢 官方给Pycharm自身占用的最大内存设低估了限制,我的Pycharm刚开始默认是256mb。 首先找到自己的Pycharm安装目录 根据合适自己的改 保存,重启Pycharm...
双ESP8266-01S通讯UDP配置
第一台ESP8266(发送命令需要勾---发送新行) ATCWMODE3 ATCWSAP_DEF"CAR_wifi_Master","12345678",5,3 //设置本地wifi名称以及密码 ATCIPSTA_DEF"192.168.4.1" //设置本地IP ATCIFSR …...
Molecular Communication(分子通信)与 Molecular Semantic Communication(分子语义通信)
1. 引言 随着传统无线通信在极端环境(如微观生物体内、海洋深处)中的局限性凸显,分子通信(Molecular Communication, MC)成为一种新型通信范式。分子通信通过分子作为信息载体,在纳米尺度上传输信息&#…...
Cookie:网页浏览背后的“小秘密”
在现代互联网的世界里,Cookie 是一个几乎无处不在的概念。它不仅影响着我们的网页浏览体验,还在背后默默地支持着许多网站的功能和服务。本文将带你全面了解 Cookie 的原理、作用、安全性以及如何管理它们。 一、什么是 Cookie? Cookie 是一…...
