数据结构(五)——树与二叉树的应用

5.5 树与二叉树的应用

5.5.1 哈夫曼树

结点的权:有某种现实含义的数值。

结点的带权路径长度:从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积。

树的带权路径长度:树中所有叶结点的带权路径长度之和(WPL,Weighted Path Length)


哈夫曼树的定义:在含有 n 个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称最优二叉树

哈夫曼树的构造
给定n个权值分别为w1, w2,..., wn的结点,构造哈夫曼树的算法描述如下:
1) 将这n个结点分别作为n棵仅含一个结点的二叉树,构成森林F.
2) 构造一个新结点,从F中选取两棵根结点权值最小的树作为新结点的左、右子树,并且将新结点的权值置为左、右子树上根结点的权值之和。
3) 从F中删除刚才选出的两棵树,同时将新得到的树加入F中。
4) 重复步骤2)和3),直至F中只剩下一棵树为止。


哈夫曼树的性质
1) 每个初始结点最终都成为叶结点,且权值越小的结点到根结点的路径长度越大。
2) 哈夫曼树的结点总数为 2n−1。
3) 哈夫曼树中不存在度为 1 的结点。
4) 哈夫曼树并不唯一,但 WPL 必然相同且为最优。

哈夫曼编码
固定长度编码――每个字符用相等长度的二进制位表示
可变长度编码――允许对不同字符用不等长的二进制位表示
若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码

有哈夫曼树得到哈夫曼编码――字符集中的每个字符作为一个叶子结点,各个字符出现的频度作为结点的权值,根据之前介绍的方法构造哈夫曼树

哈夫曼编码可用于数据压缩

5.5.2_1 并查集

逻辑结构:数据元素之间为“集合”关系

集合的两个基本操作——“并”和“查”
Find ——“查”操作:确定一个指定元 素所属集合
Union ——“并”操作:将两个不想交 的集合合并为一个

注:并查集(Disjoint Set)是逻辑结构——集合的一种具体实现,只进行 “并”和“查”两种基本操作
“并查集”的存储结构

“并查集”的代码实现——初始化

#define SIZE 13
int uFsets [ SIZE];    //集合元素数组
//初始化并查集
void Initial (int S[]){for(int i=0;i<SIZE;i++)s[i]=-1;
}

“并查集”的代码实现——并、查

//Find“查”操作,找x所属集合(返回x所属根结点)
int Find (int S[],int x){while(S[x]>=0)    //循环寻找x的根x=S[x] ;return x;         //根的s[]小于0
)// union“并”操作,将两个集合合并为一个
void union(int S[],int Root1,int Root2){//要求Root1与Root2是不同的集合if(Root1==Root2)return;//将根Root2连接到另一根Root1下面S[Root2]=Root1;

Union操作的优化
优化思路:在每次Union操作构建树的时候,尽可能让树不长高
①用根节点的绝对值表示树的结点总数
②Union操作,让小树合并到大树

// Union“并”操作,小树合并到大树
void Union (int S[],int Root1,int Root2 ){if(Root1==Root2 ) return;if(S[Root2]>S[Root1]) { //Root2结点数更少S[Root1]+=S[Root2]; //累加结点总数S[Root2]=Root1;     //小树合并到大树}else{S[Root2]+=S[Root1]; //累加结点总数S[Root1]=Root2;     //小树合并到大树}
}

 

5.5.2_2 并查集的进一步优化

拓展:Find操作的优化(压缩路径)
先找到根结点,再将查找路径上所有结点都挂到根结点下

//Find“查"操作优化,先找到根节点,再进行“压缩路径”
int Find(int S[],int x){int root = x;while(S[root]>=0)  root=S[root]; //循环找到根while(x! =root){   //压缩路径int t=S[x];    //t指向x的父节点S[x]=root;     //x直接挂到根节点下x=t;}
return root;           //返回根节点编号
}



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

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

相关文章

linux系统------------Mysql数据库介绍、编译安装

目录 一、数据库基本概念 1.1数据(Data) 1.2表 1.3数据库 1.4数据库管理系统(DBMS) 数据库管理系统DBMS原理 1.5数据库系统&#xff08;DBS) 二、数据库发展史 1、第一代数据库 2、第二代数据库 3、第三代数据库 三、关系型数据库 3.1关系型数据库应用 3.2主流的…

Saltstack 最大打开文件数问题之奇怪的 8192

哈喽大家好&#xff0c;我是咸鱼。 今天分享一个在压测过程中遇到的问题&#xff0c;当时排查这个问题费了我们好大的劲&#xff0c;所以我觉得有必要写一篇文章来记录一下。 问题出现 周末在进行压测的时候&#xff0c;测试和开发的同事反映压测有问题&#xff0c;请求打到…

一键实现数据采集和存储:Python爬虫、Pandas和Excel的应用技巧

作为一名互联网技术爱好者&#xff0c;我对数据的探索充满热情。在本文中&#xff0c;我将以豆瓣读书为案例&#xff0c;详细介绍如何利用Python爬虫、Pandas和Excel这三大工具&#xff0c;一键化地实现数据采集和存储。豆瓣读书作为一个备受推崇的图书评价平台&#xff0c;拥有…

亮剑AIGC,紫光云能否胜人一筹?

【全球云观察 &#xff5c; 科技热点关注】 扎实创新每一步&#xff0c; 先人一步快人一步。 2023年全球科技行业最火的莫过于生成式AI&#xff0c;即Artificial Intelligence Generated Content。在迈向生成式AI的道路上&#xff0c;虽然说不上千军万马&#xff0c;但是国内…

Python学习笔记------文件操作

编码 编码就是一种规则集合&#xff0c;记录了内容和二进制间进行相互转换的逻辑。 编码有许多中&#xff0c;我们最常用的是UTF-8编码 计算机只认识0和1&#xff0c;所以需要将内容翻译成0和1才能保存在计算机中。同时也需要编码&#xff0c;将计算机保存的0和1&#xff0c…

2.4 如何运行Python程序

如何运行Python程序&#xff1f; Python是一种解释型的脚本编程语言&#xff0c;这样的编程语言一般支持两种代码运行方式&#xff1a; 1) 交互式编程 在命令行窗口中直接输入代码&#xff0c;按下回车键就可以运行代码&#xff0c;并立即看到输出结果&#xff1b;执行完一行…

ReentrantLock加锁分析

1、ReentrantLock中其实是有一个AQS的子类实例的成员变量sync&#xff1b; 2、实际是调用的Sync中的lock&#xff1b;Sync是AQS的子类&#xff1b;Sync有两个子类&#xff0c;公平与非公平&#xff1b;默认为非公平&#xff1b;如下是非公平加锁分析&#xff1b; public Reentr…

Visual Basic6.0零基础教学(4)—编码基础,数据类型与变量

编码基础,数据类型与变量 文章目录 编码基础,数据类型与变量前言一、VB中的编程基础二、VB的基本字符集和词汇集1、字符集2、词汇集 VB中的数据类型VB中的变量与常量一.变量和常量的命名规则二.变量声明1.用Dim语句显式声明变量三. 常量 运算符和表达式一. 运算符 1. 算术运算符…

获取Book里所有sheet的名字,且带上超链接

应用背景&#xff1a; 当一个excel有很多sheet的时候&#xff0c;来回切换sheet会比较复杂&#xff0c;所以我希望excel的第一页有目录&#xff0c;可以随着sheet的增加&#xff0c;减少&#xff0c;改名而随时可以去更新&#xff0c;还希望有超链接可以直接跳到该sheet。 可以…

06-验证浮点数输入

鉴于shell脚本的限制和本事&#xff0c;浮点数&#xff08;或“实数”&#xff09;的验证过程乍一看似乎让人望而生畏&#xff0c;不过考虑到浮点数只不过是由小数点分隔的两个整数&#xff0c;再配合能够在脚本中引用其他脚本的能力&#xff08;validint&#xff09;&#xff…

【爬取网易财经文章】

引言 在信息爆炸的时代&#xff0c;获取实时的财经资讯对于投资者和金融从业者来说至关重要。然而&#xff0c;手动浏览网页收集财经文章耗时费力&#xff0c;为了解决这一问题&#xff0c;本文将介绍如何使用Python编写一个爬虫程序来自动爬取网易财经下关于财经的文章 1. 爬…

前端基础 Vue -组件化基础

1.全局组件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script src&…

【QA】MySQL导出某数据库的所有数据为sql文件,包含建库命令、建表命令。

文章目录 前言Windows系统下 | mysqldump导出数据库数据Docker中导入初始化数据【补充】通过命令行&#xff0c;执行sql文件&#xff0c;将数据导入到数据库在MySQL外面执行在MySQL中执行 前言 我们在用docker部署mysql项目的时候&#xff0c;往往需要对数据库进行数据初始化。…

Java-SSM电影在线播放系统

Java-SSM电影在线播放系统 1.服务承诺&#xff1a; 包安装运行&#xff0c;如有需要欢迎联系&#xff08;VX:yuanchengruanjian&#xff09;。 2.项目所用框架: 前端:JSP、layui等 后端:SSM,即Spring、SpringMvc、Mybatis等。 3.项目功能点: 3-1.后端功能: - 所有后台管理展…

rk3588内核添加特殊分辨率

rk平台内核本身默认支持一些常规的分辨率,如1920x1080@30,1280x720@60,但是往往不能满足需求,如有的客户需要你添加1020x700@35的分辨率,这时候就要自己加上去了。 下图是LCD各个参数对应的位置: 显示mode 各个参数含义如下: hdisplay:有效显示区水平像素数量,对应A…

Redis入门到实战-第十弹

Redis实战热身Geospatial篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代…

[综述笔记]Flexible large-scale fMRI analysis: A survey

论文网址&#xff1a;Flexible large-scale fMRI analysis: A survey | IEEE Conference Publication | IEEE Xplore 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff0…

关于网格数据导出指定格式的测试(以Gmsh导出nas格式为例)

本文主要讲述Gmsh如何导出nas格式的网格数据&#xff0c;众所周知&#xff0c;Gmsh可以导出多种网格数据格式&#xff0c;比如大家熟悉的msh、stl、inp、cgns&#xff08;似乎不完善&#xff09;等等&#xff0c;但是gmsh不支持nas格式的导出&#xff0c;只支持nas格式的导入&a…

银行量子金融系统应用架构设计

量子金融&#xff08;即Financial-Quantum&#xff0c;简称Fin-Q&#xff09;&#xff0c;特指量子科技在金融行业中的应用。 目前&#xff0c;量子科技中以量子保密通信、量子随机数和量子计算发展进度较快&#xff0c;取得了诸多阶段性重大技术突破和商用成果&#xff0c;这…

Linux Ncurses库部分函数使用说明

目录 1. initscr&#xff08;&#xff09;函数 2. endwin&#xff08;&#xff09;函数 3. curs_set()函数 4.noecho()函数 5. keypad()函数 6. start_color()函数 7.init_pair()函数 8.getch()函数 9.move()函数 10.addch()函数 11. refresh()函数 12.inch()函数…