哈夫曼树并查集

(1)哈夫曼树

特殊概念:

1.结点的权:表示结点树的重要性

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

2.树的带权路径长度:该树的所有叶子节点的带权路径长度之和

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

哈夫曼编码:

固定长度编码——每个字符用相等长度的二进制位表示

可变长度编码——允许对不同字符用不等长度的二进制位表示

若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码

有哈夫曼树得到哈夫曼编码——字符集中的每个字符作为一个叶子结点,各个字符出现的频度作为结点的权值

(2)并查集

用互不相交的树,表示多个“集合”

查一个元素属于哪个集合:可以从指定元素出发,一路向北,找到根结点,判断两个结点是否属于同一个集合,分别查找两个元素的根结点,判断是否相同

把两个集合合并为一个集合:让一棵树成为另一颗树的子树即可

双亲表示法更适合实现并查集

# define maxsize 100  //树中最多结点数
typedef struct {      //树中结点定义
    int data;         //数据元素
    int parent;       //双亲位置域
}ptnode;
typedef struct {      //数的类型定义
    ptnode nodes[maxsize];//双亲表示
    int n;            //结点数
}ptree;

 并查操作代码

//find查操作,找x所属集合(返回x所属根结点)
int find(int s[], int x) {
    while (s[x] >= 0)
        x = s[x];
    return x;
}
//union并操作,将两个集合合并为一个
void union(int s[], int root1, int root2) {
    //要求root1与root2是不同的集合
    if (root1 == root2)return;
    //将根root2链接到另一根root1下面
    s[root2] = root1;
}

并的时间复杂度为O(1),查的最坏时间复杂度为O(n)。

合并时让小树成为大树的子树,让高度增加的没那么快

可以用根结点的绝对值表示树的结点总数

并操作优化后代码

void union(int s[], int root1, int root2) {
    //要求root1与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;        //小数合并到大树
    }
}

查操作优化后代码

//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;          //返回根结点编号
}

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

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

相关文章

OpenGL学习笔记(六):Transformations 变换(变换矩阵、坐标系统、GLM库应用)

文章目录 向量变换使用GLM变换(缩放、旋转、位移)将变换矩阵传递给着色器坐标系统与MVP矩阵三维变换绘制3D立方体 & 深度测试(Z-buffer)练习1——更多立方体 现在我们已经知道了如何创建一个物体、着色、加入纹理。但它们都还…

麦芯(MachCore)应用开发教程5 --- 工位和晶圆传输

麦芯是构建在windows系统上的设备应用操作系统,利用该系统可以快速高效的开发一款设备专用软件。希望进一步了解请email: acloud163.com 黄国强 2025/02/03 一、工位与子设备的关系 想象工厂中的流水线工作站,每个工位(Station&#xff09…

冰蝎v3.0 beta7来啦

我用了一台kali,一台centos,一台windows,做了一个文件上传和一个反弹shell实验,载荷是AES加密的,终于感受到了对加密流量的无可奈何~ kali(php8.1)centos(php7.1)window…

Golang 并发机制-5:详解syn包同步原语

并发性是现代软件开发的一个基本方面,Go(也称为Golang)为并发编程提供了一组健壮的工具。Go语言中用于管理并发性的重要包之一是“sync”包。在本文中,我们将概述“sync”包,并深入研究其最重要的同步原语之一&#xf…

【PyQt】超级超级笨的pyqt计算器案例

计算器 1.QT Designer设计外观 1.pushButton2.textEdit3.groupBox4.布局设计 2.加载ui文件 导入模块: sys:用于处理命令行参数。 QApplication:PyQt5 应用程序类。 QWidget:窗口基类。 uic:用于加载 .ui 文件。…

Flutter Scaffold 页面结构

Material是一套设计风格,提供了大量的小部件,这里用Material风格搭建一个常见的应用页面结构。 创建Material应用 import package:flutter/material.dart;class App extends StatelessWidget {overrideWidget build(BuildContext context) {return Mat…

2月3日星期一今日早报简报微语报早读

2月3日星期一,农历正月初六,早报#微语早读。 1、多个景区发布公告:售票数量已达上限,请游客合理安排行程; 2、2025春节档总票房破70亿,《哪吒之魔童闹海》破31亿; 3、美宣布对中国商品加征10…

大模型本地化部署(Ollama + Open-WebUI)

文章目录 环境准备下载Ollama模型下载下载Open-WebUI 本地化部署的Web图形化界面本地模型联网查询安装 Docker安装 SearXNG本地模型联网查询 环境准备 下载Ollama 下载地址:Ollama网址 安装完成后,命令行里执行命令 ollama -v查看是否安装成功。安装成…

10 Flink CDC

10 Flink CDC 1. CDC是什么2. CDC 的种类3. 传统CDC与Flink CDC对比4. Flink-CDC 案例5. Flink SQL 方式的案例 1. CDC是什么 CDC 是 Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数…

【25考研】南开软件考研复试复习重点!

一、复试内容 复试采取现场复试的方式。复试分为笔试、机试和面试三部分。三部分合计100分,其中笔试成绩占30%、机试成绩占30%、面试成绩占40%。 1.笔试:专业综合基础测试 考核方式:闭卷考试,时长为90分钟。 笔试考查内容范围…

【Cadence仿真技巧学习笔记】求解65nm库晶体管参数un, e0, Cox

在设计放大器的第一步就是确定好晶体管参数和直流工作点的选取。通过阅读文献,我了解到L波段低噪声放大器的mos器件最优宽度计算公式为 W o p t . p 3 2 1 ω L C o x R s Q s p W_{opt.p}\frac{3}{2}\frac{1}{\omega LC_{ox}R_{s}Q_{sp}} Wopt.p​23​ωLCox​Rs…

【leetcode练习·二叉树拓展】归并排序详解及应用

本文参考labuladong算法笔记[拓展:归并排序详解及应用 | labuladong 的算法笔记] “归并排序就是二叉树的后序遍历”——labuladong 就说归并排序吧,如果给你看代码,让你脑补一下归并排序的过程,你脑子里会出现什么场景&#xff…

[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置

2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方,在空白处鼠标右键选择通过Code打开 打开Vscode,点击platformIO图标,选择PIO Home下的open,最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…

Docker 部署教程jenkins

Docker 部署 jenkins 教程 Jenkins 官方网站 Jenkins 是一个开源的自动化服务器,主要用于持续集成(CI)和持续交付(CD)过程。它帮助开发人员自动化构建、测试和部署应用程序,显著提高软件开发的效率和质量…

MySQL锁类型(详解)

锁的分类图,如下: 锁操作类型划分 读锁 : 也称为共享锁 、英文用S表示。针对同一份数据,多个事务的读操作可以同时进行而不会互相影响,相互不阻塞的。 写锁 : 也称为排他锁 、英文用X表示。当前写操作没有完成前,它会…

《苍穹外卖》项目学习记录-Day11销量排名统计

销量排名需要查两张表,一张是order_detail,它里面有number字段,这个字段体现了商品的销售的份数。我们仅仅查这一张表是不够的,因为用户下单了,下单了之后就会产生订单数据和对应的订单详情数据,假设他下完…

走向基于大语言模型的新一代推荐系统:综述与展望

HightLight 论文题目:Towards Next-Generation LLM-based Recommender Systems: A Survey and Beyond作者机构:吉林大学、香港理工大学、悉尼科技大学、Meta AI论文地址: https://arxiv.org/abs/2410.1974 基于大语言模型的下一代推荐系统&…

Vue3学习笔记-模板语法和属性绑定-2

一、文本插值 使用{ {val}}放入变量&#xff0c;在JS代码中可以设置变量的值 <template><p>{{msg}}</p> </template> <script> export default {data(){return {msg: 文本插值}} } </script> 文本值可以是字符串&#xff0c;可以是布尔…

python算法和数据结构刷题[5]:动态规划

动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种算法思想&#xff0c;用于解决具有最优子结构的问题。它通过将大问题分解为小问题&#xff0c;并找到这些小问题的最优解&#xff0c;从而得到整个问题的最优解。动态规划与分治法相似&#xff0c;但区别在于动态…

【阅读笔记】New Edge Diected Interpolation,NEDI算法,待续

一、概述 由Li等提出的新的边缘指导插值(New Edge—Di-ected Interpolation&#xff0c;NEDI)算法是一种具有良好边缘保持效果的新算法&#xff0c;它利用低分辨率图像与高分辨率图像的局部协方差问的几何对偶性来对高分辨率图像进行自适应插值。 2001年Xin Li和M.T. Orchard…