C语言的数据结构:树与二叉树(哈夫曼树篇)

前言

上篇讲完了二叉树,二叉树的查找性能要比树好很多,如平衡二叉树保证左右两边节点层级相差不会大于1,其查找的时间复杂度仅为 l o g 2 n log_2n log2n,在两边层级相同时,其查找速度接近于二分查找。1w条数据,平衡二叉树的查找最差情况下仅有14次,而普通树(也就是多叉树),如果每层都有100个节点,第二层可以接近1w(9999)条数据,其查找的时间复杂度也高的多。

但多叉树在文件系统和数据库的应用中表现很好,像自平衡多叉树(B - 树)其在磁盘io操作的速度也更好,像 mysql 的索引采取就是 B+ 树。

如果上面的二叉树和多叉树在表现中已经这么好了,为什么还要有哈夫曼树这种结构?

哈夫曼树的应用场景主要是数据压缩,特别是通过哈夫曼编码进行文件压缩。哈夫曼树的设计目的是通过构建一棵带权路径长度最小的二叉树,来减少编码长度,提高压缩效率。前提是哈夫曼树的构建要基于权重,也就是这么多的数据,它要知道哪些是经常被访问的,经常访问的则权重高,反之则权重低。

像下面这棵树,如果我们已经知道 D的访问次数较高,一共要访问5次,而B的访问次数只有1次,则将D、B全部访问完需要:
B:路径A -> B, 路径为1,访问次数为1,总访问 路长为 1 \color{orange}路长为1 路长为1
D:路径A -> B -> D ,路径为2,访问次数为5,总访问 路长为 10 \color{orange}路长为10 路长为10
D、B全部访问:1 + 10 = 11 。

但如果按照哈夫曼树的构造,会生成下面这样。
在这里插入图片描述
我们已经知道 D的访问次数较高,一共要访问5次,而B的访问次数只有1次,则将D、B全部访问完需要:
B:路径A -> D -> B, 路径为2,访问次数为1,总访问 路长为 2 \color{orange}路长为2 路长为2
D:路径A -> D ,路径为1,访问次数为5,总访问 路长为 5 \color{orange}路长为5 路长为5
D、B全部访问:5 + 2 = 7 。

可以看到,存储同样的数据,仅仅只是按照权重换了数据的位置,就可以减少总访问路径长度

那一个数据当中,又是如果知道哪些数据会经常访问,哪些是不经常呢?一个是来源于对过往的总结。如一个学校的成绩分布有[小于50、50-80、80-100],而经常几次考试的结果发现,大多数都在50-80的区域,那这个哈夫曼树的最
接近根节点的应该是 50-80 。也有些是通过对文字的出现次数总结,如有人统计出26个英文字母中,什么字母使用的最多,什么字母使用的最少,则也可以构建出基于此的哈夫曼树。而哈夫曼编码就来源于此。

​​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

160相交链表

解法1: public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {// 定义两个指针。// 获得两个链表的长度,将较长的链表先用指针移动到和短链表一样的长度。// 再一个个比较ListNode l1 headA, l2 headB;int …

vs2017调试MFC源码与dll版本不匹配

如上图,使用VS2017调试MFC源码,提示源码与dll不匹配。 经过一番折腾终于找到了原因:同时安装了vs2017、vs2022,结果加载的mfc140ud.dll不是vs2017的,而是vs2022的,主版本号虽然都是14,但小版本…

Jmeter下载、安装及配置

1 Jmeter介绍 Jmeter是进行负载测试的工具,可以在任何支持Java虚拟机环境的平台上运行,比如Windows、Linux、Mac。 Jmeter模拟一组用户向目标服务器发送请求,并统计目标服务器的性能信息,比如CPU、memory usage。 2 Jmeter下载 …

BLACKBOX.AI:解锁编程学习新纪元,加速开发的AI得力助手

文章目录 💯BLACKBOX.AI 官网🍁1 BLACKBOX.AI 工具使用教程🍁2 BLACKBOX.AI工具使用界面介绍🍁3 Chat(聊天)功能🍁4 Explore (探索)功能💎4.1 Terminal(终端)功能💎4.2 Discover(发现)功能&…

【Verilog HDL-1】基本、向量、模块

HDL习题 1 阻塞型赋值‘’与非阻塞型赋值‘<’ 阻塞型赋值 b a ba ba&#xff1a;适用于纯组合电路 非阻塞型赋值 b < a b<a b<a&#xff1a;适用与时序逻辑电路 2 wire线型,assign连续赋值 wire a,b,c; assign b a; assign c a;与编程语言不同&#xff…

普通集群与镜像集群配置

一. 环境准备 关闭防火墙和selinux&#xff0c;进行时间同步 rabbitmq-1 Rocky_linux9.4 192.168.226.22rabbitmq-2Rocky_linux9.4192.168.226.23rabbitmq-3Rocky_linux9.4192.168.226.24 修改主机名#192.168.226.22 hostnamectl set-hostname rabbitmq-1#192.168.226.22 ho…

【操作系统期末速成】 EP03 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点五&#xff1a;进程的概念及特征2.1 考点六&#xff1a;进程的状态与切换 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 回报不在行动之后&#xff0c;回报在行动…

HIVE每日一题

select * from sku_info order by sku_id ; 为什么结果没有顺序排序。什么原因导致的&#xff1f;

75. UE5 RPG 创建场景摆放部件蓝图

这一篇文章来点简单的内容&#xff0c;相当于我们使用蓝图创建类似于unity的预制体。 创建一个一个柱子蓝图 首先&#xff0c;我们创建一个立柱的蓝图&#xff0c;将我们之前创建的柱子上面含有火焰和灯光的部分合并成一个蓝图&#xff0c;方便往场景内添加。 点击创建一个基…

【SpringBoot】SpringBoot核心启动流程源码解析

SpringBoot总体流程 当我们启动一个SpringBoot程序的时候&#xff0c;只需要一个main方法就可以启动&#xff0c;但是对于其中流程时如何执行的&#xff0c;以及如何调用spring的IOC和AOP机制&#xff0c;本篇带着这个问题来整体体系化的梳理下流程。 SpringBootApplication …

【语言模型】Xinference的部署过程

一、引言 Xinference&#xff0c;也称为Xorbits Inference&#xff0c;是一个性能强大且功能全面的分布式推理框架&#xff0c;专为各种模型的推理而设计。无论是研究者、开发者还是数据科学家&#xff0c;都可以通过Xinference轻松部署自己的模型或内置的前沿开源模型。Xinfe…

一种基于滑动窗口扩展上下文的RAG(检索增强生成)优化实现方案实践

RAG&#xff08;检索增强生成&#xff09;是一种结合了检索&#xff08;通常是知识库或数据库&#xff09;和生成模型&#xff08;大语言模型&#xff09;的技术&#xff0c;目的是在生成文本的时候能够参考相关的外部知识。这样&#xff0c;即使生成模型在训练时没有看到某些信…

使用Dockerfile构建镜像 使用docker-compose 一键部署IM项目

本文讲解&#xff1a;使用Dockerfile构建镜像 & 使用docker-compose 一键部署IM项目。 im项目地址&#xff1a;xzll-im &#xff0c;欢迎志同道合的开发者 一起 维护&#xff0c;学习&#xff0c;欢迎star &#x1f604; 1、Dockerfile编写与镜像构建&容器运行 Dockerf…

大语言模型(LLM)LangChain介绍

LangChain是一个利用大语言模型的能力开发各种下游应用的开源框架&#xff0c;它的核心理念是为各种大语言模型应用实现通用的接口&#xff0c;简化大语言模型应用的开发难度&#xff0c;主要的模块示意图为&#xff1a; Index&#xff1a;提供了各类文档导入、文本拆分、文本向…

夏天到了,用这两款软件,悄悄惊艳所有人!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 夏天来了&#xff0c;又到了“露肉”的季节&#xff0c;或许大家会为了身材烦恼&#xff0c;即便有运动意愿却苦于健身计划和时间上安排&#xff0c;也没有合适的免费软件。 别担心&a…

1-爬虫基础知识(6节课学会爬虫)

1-爬虫基础知识&#xff08;6节课学会爬虫&#xff09; 1.什么是爬虫2.爬取的数据去哪了3.需要的软件和环境4.浏览器的请求&#xff08;1&#xff09;Url&#xff08;2&#xff09;浏览器请求url地址&#xff08;3&#xff09;url地址对应的响应 5.认识HTTP/HTTPS5.1 http协议之…

餐饮火锅加盟网站pbootcms模板源码

模板介绍 如果您正在创建火锅店、餐饮店或加盟网站&#xff0c;小编推荐您下载这款餐饮火锅加盟网站pbootcms模板源码&#xff0c;整站源码响应式自适应的设计&#xff0c;可以让您自由编辑且适应任何终端浏览器&#xff0c;节约您的建站时间成本。 模板截图 源码下载 餐饮火…

生成式人工智能和机器人技术是否即将取得最后的突破?

了解生成式人工智能与机器人技术的融合如何彻底改变从医疗保健到娱乐等行业 想象一下这样一个世界&#xff0c;机器人可以谱写交响乐、画出杰作、写出小说。这种创造力与自动化的迷人融合&#xff0c;由 生成式人工智能&#xff0c;不再是梦想&#xff1b;它正在以重大方式重塑…

前后端分离的后台管理系统开发模板(带你从零开发一套自己的若依框架)上

前言&#xff1a; 目前&#xff0c;前后端分离开发已经成为当前web开发的主流。目前最流行的技术选型是前端vue3后端的spring boot3&#xff0c;本次。就基于这两个市面上主流的框架来开发出一套基本的后台管理系统的模板&#xff0c;以便于我们今后的开发。 前端使用vue3ele…

go Channel 原理 (一)

Channel 设计原理 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存。 在主流编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存。 Go 可以使用共享内存加互斥锁进行通信&#xff0c;同时也提供了一种不同的并发模型&#xff0c;即通…