不相交集合的数据结构

news2024/11/13 16:42:04

一、不相交集合的操作

        不相交集合的数据结构维护了一组不相交动态集的集合 S=\left \{ S1,S2,S3.......\right \},用集合中的某个成员作为代表标识集合。

        集合在没有修改的情况下每次访问代表得到的答案是相同的,此外在其它一些应用中,可能按照规定选择集合的代表,例如选择每个集合中关键字最小的元素作为代表。

设 x 为一个对象,对不相交集合数据结构的操作:

        1.MAKE-SET(x):建立一个新集合,唯一元素就是 x ,由于各个集合是不相交的,x 不会出现在其他的集合中       

        2.FIND-SET(x):返回一个指针,指向包含 x (唯一)的集合代表                                                          如果已经有指针指向 x ,无需再在数据结构中搜索 x 

        3.UNION(x,y):将包含 x 和 y 的两个动态集合(表示为 Sx 和 Sy)合并成一个新的集合,即两个集合的并集。 并集中的任何一个元素都可以作为代表(通常实现为 Sx 或 Sy 元素的代表)。由于要求各个元素不相交,合并后需要删除 Sx 和 Sy 集合,通常将一个集合并入另一个集合作为删除操作当共有n个元素时,最多执行 n-1 次UNION操作。

        不相交集合的应用——确定无向图的连通分量

   在开始时,需要通过 MAKE-SET(v) 操作将每个节点 v 都放入子集的集合中,再对处理的边(u,v)将包含 u 和 v 的集合合并(前提是两个集合本身不相交,即集合代表不相同)。

        判断两个节点是否在同一个集合中,即所属集合的集合代表不相同

                FIND-SET(x) ! = FIND-SET(y)

            Edge processed:对两点之间边处理顺序 

二、不相交集合的链表表示

        1.相关概念

        每个集合用一个链表来表示,链表的第一个节点就是代表每个集合对象 set 包含 head 指针 和 tail 指针分别指向链表中的第一个节点和最后一个节点。

        链表中的每个节点都包含一个集合成员(元素),指向链表中下一个节点的指针,指回到集合对象的指针

        2.不相交集合的链表操作

        ① MAKE-SET(x) :

                  创建一个只有 x 节点的新的链表     时间开销 O(1)

        ② FIND-SET (x):

             沿着 x 对象的返回指针返回到集合对象,然后返回 head 指针指向的节点。 时间开销 O(1)

        ③ UNION(x,y):

                1.将包含 y 的链表添加到包含 x 的链表

                2.将包含 x 的链表的代表 作为 y 中节点的代表

                3.更新包含 y 链表中各个元素的代表指针    包含 n 个操作的序列可能会花费O(n^{2})时间

        合并的简单实现:

                将长链表插入到短链表之中 总开销是O(n^{2})   平均开销是Θ(n)        

       3.一种加权合并的启发式策略

        将链表的长度作为权值并维护链表长度,合并时将短的链表拼接到长的链表末尾

        定理:使用不相交集合的链表表示和加权合并的启发式策略,一个具有 m 个 MAKE-SET FIND-SET 和 UNION 操作的序列 (其中 n 个 为 MAKE-SET操作),需要的时间为        O(m+nlogn)

三、不相交集合森林

        在不相交集合实现中,使用有根树来表示集合,树中的每个节点包含一个成员,每棵树代表一个集合。 在不相交集合森林中,每个成员仅指向他的父节点(根节点指向其自己),并且每棵树的根是集合的代表。

        1.不相交集合森林的操作

        ①MAKE-SET : 建立一个包含节点 x 的新树,并且其的父节点指向自己(根节点)

void MAKE-SET(int x)
{
    x.p=x;
    x.rank=0;
    return ;
}

        ②FIND-SET(x) :返回 x 所在树的集合代表(根节点)。

        FIND-SET(x) 用于鉴定集合是否包含元素 x 

        FIND-SET (x) 和 FIND-SET (y) 返回相同的值,当且仅当元素 x 和 y 同属一个集合

int FIND-SET (int x)
{ 
    if (x≠x.p)    // x不是根 
        x.p=FIND-SET(x.p);
    return x.p;
}

        ③ UNION(x,y) :合并包含 x 和 y 的集合的树

        若两棵树的根的秩不相同,则将具有较小秩的根点的父指针指向具有较大秩的根结点;

        若两棵树的根的秩相同,则任意选择两个根中的一个作为父结点,并将它的秩加一。

        一颗二项树的节点的秩(rank)等于它的儿子节点的个数,

void UNION (int x,int y)
{ 
    LINK(FIND-SET(x), FIND-SET(y)); 
}
void LINK(int x,int y)
{
    if(x.rank>y.rank)
       y.p=x;
    else x.p=y;
   if(x.rank==y.rank)
      y.rank=y.rank+1;
    return ;
}

        ④ 节点数据结构

        使用包含两个字段的结点: element and parent

        使用数组 table[] ,其中 table[x] 是一个指向元素 x 的指针 为了执行 FIND-SET (x) 操作, 从 table[i] 标明的结点开始,顺着parent 字段,直到找到结点,使得 parent 字段值为 null 返回根节点的 element

        2.两条启发式规则(改进运行时间)

        ① 按秩合并:执行 UNION 操作时,通过权重或者树高操作

        树的根节点必须要么记录树高,要么记录元素个数.

        当使用树高规则时,仅当两棵树高度相等时,树高会增加.

        当使用权重规则时,新树的权重是两个子树的权重之和.

        树高规则:将树高小的树作为作为树高大的树的子树

         权重规则:包含元素少的那棵树作为元素多的子树

        ②路径压缩 :缩短查找根节点过程中的路径

        在FIND-SET操作中,可以使查找路径中的每个结点直接指向根

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

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

相关文章

Java:使用BigDecimal、NumberFormat和DecimalFormat保留小数

一、代码和调试结果 1.1 BigDecimal ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fa36749de8124266a730817710fdf737.png) 1.2 DecimalFormat 1.3 NumberFormat 二、原代码 BigDecimalUtil.java 代码 package utils;import java.math.BigDecimal; import jav…

NAT技术总结与双向NAT配置案例

NAT的转换方式: 1.静态转换:固定的一对一IP地址映射。 interface GigabitEthernet0/0/1 ip address 122.1.2.24 nat static global 122.1.2.1 inside 192.168.1.1 #在路由器出接口 公网地址 私网地址。 2.动态转换:Basic NAT nat address-gr…

[ROS 系列学习教程] 建模与仿真 - URDF 建模实践

ROS 系列学习教程(总目录) 本文目录 一、机器人结构组成二、新建功能包三、编写launch文件四、创建底盘五、添加轮子六、添加其他部件七、解决部分实体位于地面以下的问题 前文介绍了URDF建模与URDF语法,接下来介绍怎么使用URDF从零构建一个机器人模型并在rviz中显示…

智能防疫电梯模拟控制系统设计-设计说明书

设计摘要: 本设计是基于单片机的智能防疫电梯模拟控制系统,主要实现了多项功能。首先,系统进行无接触测温,如果温度正常则可以启动电梯运行,如果温度异常则电梯会报警提示有乘客体温异常,电梯不会运行。其…

Java——CLASSPATH配置

什么是CLASSPATH? 答: classpath类似于windows中的系统环境变量path。 在windows中,如果要想在DOS命令窗口中执行一个程序。系统会先去当前文件路径下找对应命令的执行程序。如果找不到,就会到系统环境变量path中挨个遍历每一个路…

代码随想录算法训练营第二十五天:树的最后学习

代码随想录算法训练营第二十五天:树的最后学习 如果不对递归有深刻的理解,本题有点难 单纯移除一个节点那还不够,要修剪! #669. 修剪二叉搜索树 力扣题目链接(opens new window) 给定一个二叉搜索树,同时给定最小边界…

vs2019 c++里用 typeid() . name () 与 typeid() . raw_name () 测试数据类型的区别

(1) 都知道,在 vs2019 里用 typeid 打印的类型不大准,会主动去掉一些修饰符, const 和引用 修饰符会被去掉。但也可以给咱们验证学到的代码知识提供一些参考。那么今天发现其还有 raw_name 成员函数,这个函…

Qt多文档程序的一种实现

注&#xff1a;文中所列代码质量不高&#xff0c;但不影响演示我的思路 实现思路说明 实现DemoApplication 相当于MFC中CWinAppEx的派生类&#xff0c;暂时没加什么功能。 DemoApplication.h #pragma once#include <QtWidgets/QApplication>//相当于MFC中CWinAppEx的派生…

【RAG 论文】IRCoT:基于 CoT 的交叉检索解决多步骤问题

论文&#xff1a;Interleaving Retrieval with Chain-of-Thought Reasoning for Knowledge-Intensive Multi-Step Questions ⭐⭐⭐⭐ ACL 2023, arXiv:2212.10509 Code: github.com/stonybrooknlp/ircot 论文速读 大多数 RAG 都是一次检索来辅助 LLM 生成&#xff0c;但是面对…

fastjson1.2.68对于文件操作的分析最全

fastjson1.2.68对于文件操作的分析 前言分析复制文件写入文件清空文件读取文件分析poc拓宽场景极限环境poc优化修改再次优化poc的分析 前言 这次分析也是分析了很久&#xff0c;因为每个链子都是自己去跟着分析了的&#xff0c;然后主要是去学习了一下怎么去挖链子 分析 前面…

洛谷P1364 医院设置

P1364 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c…

四、基于Stage模型的应用架构设计

前面我们了解了如何构建鸿蒙应用以及开发了第一个页面&#xff0c;这只是简单的demo&#xff1b;那么如何去设计&#xff0c;从0到1搭建一个真正的应用呢 一、基本概念 1、Stage模型基本概念 Stage模型概念图 AbilityStage&#xff1a;是一个Module级别的组件容器&#xff0…

红蓝对抗 网络安全 网络安全红蓝对抗演练

什么是红蓝对抗 在军事领域&#xff0c;演习是专指军队进行大规模的实兵演习&#xff0c;演习中通常分为红军、蓝军&#xff0c;演习多以红军守、蓝军进攻为主。类似于军事领域的红蓝军对抗&#xff0c;网络安全中&#xff0c;红蓝军对抗则是一方扮演黑客&#xff08;蓝军&…

BUUCTF靶场[MISC]wireshark、被嗅探的流量、神秘龙卷风、另一个世界

[misc]wireshark 考点&#xff1a;流量、追踪流 工具&#xff1a;wireshark 先看题目&#xff0c;管理员密码 将下载的文件用wireshark打开&#xff0c;查找flag 点击追踪tcp流&#xff0c;开始挨个查看flag [misc]被嗅探的流量 考点&#xff1a;流量、追踪流 工具&#xf…

类和对象、包等知识总结Java

类 类的概念&#xff1a;类是用来对一个实体&#xff08;对象&#xff09;进行描述的&#xff0c;主要描述该对象的属性&#xff0c;功能等。 类的定义和实例化 定义 定义类需要用到class关键字 &#xff08;大驼峰定义&#xff09;for example:class Dog... 初步了解一下…

2024年5月16日 十二生肖 今日运势

小运播报&#xff1a;2024年5月16日&#xff0c;星期四&#xff0c;农历四月初九 &#xff08;甲辰年己巳月庚辰日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;猴、鼠、鸡 需要注意&#xff1a;牛、兔、狗 喜神方位&#xff1a;西北方 财神方位&#xff1a;…

【2024年电工杯数学建模竞赛】选题分析+A题B题完整思路+代码分享

.2024年电工杯数学建模AB题选题思路 比赛开始第一时间在下面的资料裙分享&#xff1a; 点击链接加入群聊【2024数维杯数学建模ABC题资料汇总】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kBwulH5tSN2X7iLXzZHAJqRk9sYnegd0y&authKey2TSsuOgqXZQ%2FvTX4R59…

ADS使用记录之使用RFPro进行版图联合仿真-加入集总元器件

ADS使用记录之使用RFPro进行版图联合仿真-加入集总元器件 ADS使用记录之使用RFPro进行版图联合仿真中已经简单介绍了使用RFPro对版图就行仿真的方法。但是&#xff0c;如果版图中含有一些非微带的结构&#xff0c;比如说电感、电容、晶体管呢&#xff0c;在此举例解释一下。 …

什么可以替代iframe?

网页嵌套中&#xff0c;iframe曾几何时不可一世&#xff0c;没有其他更好的选择&#xff01; iframe即内联框架&#xff0c;作为网页设计中的一种技术&#xff0c;允许在一个网页内部嵌套另一个独立的HTML文档。尽管它在某些场景下提供了便利&#xff0c;但也存在多方面的缺陷…

【Python报错】Python安装模块时报错Fatal error in launcher

【Python报错】Python安装模块时报错Fatal error in launcher 最近需要用到python下载一个小工具&#xff0c;自信敲下回车键本想看到黑乎乎的终端上会出现快速跳跃的命令代码&#xff0c;没想到&#xff0c;报错了...... Fatal error in launcher: Unable to create process …