不相交集合的数据结构

一、不相交集合的操作

        不相交集合的数据结构维护了一组不相交动态集的集合 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.mzph.cn/pingmian/12918.shtml

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

相关文章

【CSS基础】

4.CSS基础 4.1css的介绍 层叠样式表(英文全称:Cascading Style Sheets),是一种对web文档添加样式的简单机制,属于表现层的布局语言.4.2css基础语法 CSS语法由两部分组成:选择符、声明。 声明包括:属性和属性值选择符 {属性: 属性值 ;属性:…

docker 配置文件使用经验,后续持续增加

1. 容器中如何访问主机服务 在docker容器、docker compose 中如何访问主机服务呢? docker容器 20.10.0 版本在 linux 新增 host.docker.internal 支持: docker run -it --add-hosthost.docker.internal:host-gateway alpine cat /etc/hosts 127.0.0.…

leetcode hot100_part28_图论

目录 200.岛屿数量 DFS bfs 并查集 994.腐烂的橘子 207.课程表 DFS BFS 208.实现Trie(前缀树) 做完了这四题,总结一下,还是要掌握基本的dfs,bfs模版,都是在这些基础上变换的。 模版: …

项目-坦克大战

增加功能 我方坦克在发射的子弹消亡后,才能发射新的子弹。同时实现发多颗子弹 1,在按下J键,我们判断当前hero对象的子弹,是否已经销毁2,如果没有销毁,就不去触发shotEnemyTank3,如果已经销毁&…

WebSocket or SSE?即时通讯的应用策略【送源码】

最近在研究H5推送,发现除了我们常用的WebSocket以外,其实还有一种协议也能实现H5推送,那就是SSE协议。 而且,当前主流的大模型平台,比如ChatGPT、通义千问、文心一言,对话时采用的就是SSE。 什么是SSE协议…

文件上传OSS实现

1). 定义OSS相关配置 在sky-server模块 application-dev.yml sky:alioss:endpoint: oss-cn-hangzhou.aliyuncs.comaccess-key-id: LTAI5tPeFLzsPPT8gG3LPW64access-key-secret: U6k1brOZ8gaOIXv3nXbulGTUzy6Pd7bucket-name: sky-take-outapplication.yml spring:profiles:a…

100m/s高速轧制钢材 八轴测径仪检测毫无压力

关键词:八轴测径仪,在线测径仪,钢材测径仪,高速轧制 随着技术的提升,钢材的生产速度越来越快,一些高速生产的钢材,生产速度甚至达到了100m/s,这是一个非常快的速度。 如果汽车以120公里/小时的速度行驶,那么…

Unity WebGL全屏显示

一、删除footer节点 二、删除最下面点击事件绑定 修改Canvas宽高 canvas.style.width "960px"; canvas.style.height "600px"; 改成 canvas.style.width document.documentElement.clientWidth"px"; canvas.style.height document.document…

行为驱动开源免费接口测试框架:karate

什么是行为驱动测试: 行为驱动测试(Behavior-Driven Testing,简称 BDT)是一种测试方法,旨在通过描述系统行为和功能来编写测试用例。BDT的重点是从用户的角度出发,描述系统应该如何行为,而不是专…

计算机视觉全系列实战教程:(二)Opencv4+VS2022开发环境搭建

1.下载和安装 VS2022下载:https://visualstudio.microsoft.com/zh-hans/vs/ Opencv下载:https://opencv.org/releases/ Opencv安装有多种方式,一般学习者直接下载.exe傻瓜式安装即可 2.VS2022配置opencv4开发环境 (1&#xff0…

Ubuntu设置中文教程

一、前言 Ubuntu是一款广受欢迎的Linux发行版,其界面友好、易用性强,并且拥有庞大的用户群体和丰富的社区资源。对于使用非英文操作系统的用户来说,将Ubuntu设置为中文界面是非常必要的。本文将介绍如何在Ubuntu中设置中文环境。 二、准备工…

DiskANN数据布局

_mem.index.data:和sift_base.fbin一模一样。0-3字节是总向量数,4-7是每个向量的特征数。后面就是依次放置的每个向量。 _disk.index:是存储的图,但是不光包含图也包含原始向量。前4KB不知道存的是啥。从第0x1000开始存放的是原始…

国内企业更喜欢私有化部署的 6 大原因

今天在 V 站看到一篇题为《为什么国内企业会更倾向于接受私有部署而不是 SaaS?》的帖子,觉得很有启发,这里把网友的观点稍作整理和总结,分享给大家参考。 在技术日益发展的今天,国内企业的软件部署方式似乎呈现出与欧…

【机器学习】机器学习:人工智能中实现自动化决策与精细优化的核心驱动力

🔒文章目录: 💥1.概述 ❤️2.机器学习基本原理 🛤️2.1定义与关键概念 🛣️2.2 机器学习算法 ☔3.自动化决策中的机器学习应用 🚲4.精细优化与机器学习的结合 👊5.挑战与前景 💥1.概述 …

样式表单MIME 类型 “text/plain“ 不是 “text/css“问题处理

样式表单www.*.com/static/js/*.css未载入,因为它的 MIME 类型 "text/plain" 不是 "text/css"。 原因是服务器返回的MIME类型为 "text/plain",而预期应该是 "text/css"。MIME类型是一种标准,用于定…

基于微信小程序+JAVA Springboot 实现的【房屋租赁管理系统】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称: 基于微信小程序的房屋租赁管理系统 在本次项目开发中,我们成功构建了一款基于微信小程序的房屋租赁管理系统,旨在通过现代化信息技术提升房屋租赁服务的效率和质量。以下是对本项目的全面总结: 项目背景与目…

js之选项卡制作实例

大家好&#xff0c;今天给大家书写选项卡实例&#xff0c;话不多说&#xff0c;直接上干货 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

nginx中,location匹配规则解析

一.location匹配规则解析 1.默认"/"配置规则 server{listen 90;# /后面在html目录下能够配置就可以直接访问到 location /{root html;index index.html;} }2.精确"="匹配 server{listen 90;#精确匹配只能匹配到"/home/imooc/img/face1.png"这…

Redis-分片集群存储及读取数据详解

文章目录 Redis分片集群是什么&#xff1f;Redis分片集群的存储及读取数据&#xff1f; 更多相关内容可查看 Redis分片集群是什么&#xff1f; Redis分片集群是一种分布式部署方式&#xff0c;通过将数据分散存储在多个Redis节点上&#xff0c;从而提高了系统的性能、扩展性和…

【linux】用sed 命令修改json文件,正则表达式的复杂用法,全部替换或只替换第一次

全部替换比较容易&#xff0c;只替换一次比较难&#xff0c;没有例子可能搞半天都搞不出来&#xff0c;tips: 如果匹配表达式有问题可以使用p这个选项调试。 一、使用正则表达式搜索文件的内容&#xff0c;把所有的匹配项全部替成的新的字符串 有一个文件名叫file.json, 把里面…