不相交集合的数据结构

一、不相交集合的操作

        不相交集合的数据结构维护了一组不相交动态集的集合 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操作中,可以使查找路径中的每个结点直接指向根

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

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

相关文章

es 分词器(五)之elasticsearch-analysis-jieba 8.7.0

es 分词器(五)之elasticsearch-analysis-jieba 8.7.0 今天咱们就来讲一下es jieba 8.7.0 分词器的实现,以及8.x其它版本的实现方式,如果想直接使用es 结巴8.x版本,请直接修改pom文件的elasticsearch.version版本号即可…

光栅化技术在AI去衣应用中的创新探索

引言: 随着计算机视觉和人工智能技术的飞速发展,AI去衣技术逐渐走进公众视野。这一技术以其独特的应用前景和技术挑战引起了广泛的关注。在实现衣物去除的同时保持图像质量的关键技术之一,便是光栅化技术。本文将深入探讨光栅化技术在AI去衣中…

软考中级-软件设计师 (十一)标准化和软件知识产权基础知识

一、标准化基础知识 1.1标准的分类 根据适用的范围分类: 国际标准指国际化标准组织(ISO)、国际电工委员会(IEC)所制定的标准,以及ISO所收录的其他国际组织制定的标准。 国家标准:中华人民共和…

康谋产品 | 车载以太网:智能汽车通信的加速器

摘要: 在智能汽车技术飞速发展的今天,车载网络已成为汽车智能化的重要基础。想象一下,如果汽车的每个部件都是一个信息节点,它们之间需要即时、准确地交换大量数据,那么一个高速、高效的网络就成为了必不可少的基础设…

SFTPGO 整合minio AD群组 测试 |sftpgo with minio and ldap group test

SFTP-GO 研究 最近在测试sftpgo,发现中文的资料比较少,在企业中很多存储开始支持S3,比如netapp 于是想尝试把文件服务器换成sftpgoS3的存储,sftp go和AD 群组的搭配测试比较少 自己测试了一把,觉得还是没有server-u的A…

【计算机毕业设计】springboot反诈科普平台的设计与实现

相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低反诈科普平台的运营人员成本,实现了反诈科普平台的 标准化、制度化、程序化的管理,有效地防止了反诈科普平台的随意管理,提高了信息的处理速度和精确度,能够…

MYSQL-9.问题排查

问题排查的思路与方向 问题排查思路 分析问题:根据理论知识经验分析问题,判断问题可能出现的位置或可能引起问题的原因,将目标缩小到一定范围;排查问题:基于上一步的结果,从引发问题的“可疑性”角度出发…

Vue3+ts(day06:路由)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】,记录一下学习笔记,用于自己复盘,有需要学…

基于Pytorch深度学习神经网络MNIST手写数字识别系统源码(带界面和手写画板)

第一步:准备数据 mnist开源数据集 第二步:搭建模型 我们这里搭建了一个LeNet5网络 参考代码如下: import torch from torch import nnclass Reshape(nn.Module):def forward(self, x):return x.view(-1, 1, 28, 28)class LeNet5(nn.Modul…

【传知代码】VRT: 关于视频修复的模型(论文复现)

前言:随着数字媒体技术的普及,制作和传播视频内容变得日益普遍。但是,视频中由于多种因素,例如传输、存储和录制设备等,经常出现质量上的问题,如图像模糊、噪声干扰和低清晰度等。这类问题对用户的体验和观…

数学建模——农村公交与异构无人机协同配送优化

目录 1.题目 2.问题1 1. 问题建模 输入数据 ​编辑 2. 算法选择 3.数据导入 3.模型构建 1. 距离计算 2. 优化模型 具体步骤 进一步优化 1. 重新定义问题 2. 变量定义 3. 优化目标 具体步骤 再进一步优化 具体实现步骤 1. 计算距离矩阵 2. 变量定义 3. 约束…

NVM安装及VUE创建项目的N种方式

VUE 参考官网:https://cli.vuejs.org/zh/guide/ 目录 NVM安装 1.卸载node.js 2.安装nvm ​编辑​ 3.配置 4.使用nvm安装node.js 5.nvm常用命令 创建VUE项目 1.使用vue init 创建vue2(不推荐) 2.使用vue create创建vue2和3&#xff…

(保姆级教程傻瓜式操作)树莓派--基于opencv实现人脸识别

前言 因为当时没有边实验边记录,所以这篇文章可能存在疏漏。不过很多地方我推荐了我参考过的博客或者视频,希望尽可能地解答您的疑惑,如果您仍有不懂的地方,欢迎评论,如果我知道答案,我会很乐意为您解答。 …

C++错题集(持续更新ing)

Day 1 一、选择题 解析: 在数字不会溢出的前提下,对于正数和负数,有: 1)左移n位,相当于操作数乘以2的n次方; 2)右移n位,相当于操作数除以2的n次方。 解析&#xff1a…

基于51单片机的自动浇花器电路

一、系统概述 自动浇水灌溉系统设计方案,以AT89C51单片机为控制核心,采用模块化的设计方法。 组成部分为:5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块,结构如…

51单片机超声波测距_液位检测_温度检测原理图PCB仿真代码

目录 实物图: PCB ​原理图​ 仿真图 ​编辑 程序 资料下载地址:51单片机超声波测距-液位检测-温度检测原理图PCB仿真代码 主控为stc89c52,通过ds18b20进行温度采集,超声波测距,距离不可以超过1m,通过按键可以设…

做简单易用的GIS资源管理软件

在室外资源管理领域,采用基于GIS的解决方案已成为主流趋势,旨在实现资源的高效利用和管理。GIS技术结合资源对象的规划、定位和监控,为企业提供全面的管理方案,从而优化资源使用、提高运营效率和降低成本。 然而,许多资…

shell脚本实现linux系统自动化配置免密互信

目录 背景脚本功能脚本内容及使用方法 1.背景 进行linux自动化运维时需要先配置免密,但某些特定场景下,做了互信的节点需要取消免密,若集群庞大节点数量多时,节点两两之间做互信操作非常麻烦,比如有五个节点&#x…

计网面试干货---带你梳理常考的面试题

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、HTTP和HTTPS的区别 1.安全性:HTTPS通过SSL/TLS协议对数据进行加密处理,有效防止数据在传输过…