不相交集合的数据结构

一、不相交集合的操作

        不相交集合的数据结构维护了一组不相交动态集的集合 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,一经查实,立即删除!

相关文章

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

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

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的重点是从用户的角度出发,描述系统应该如何行为,而不是专…

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.概述 …

基于微信小程序+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…

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

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

19个测试⽤例⽣成的AI⼯具!卷起来!

在不断发展的软件开发领域中&#xff0c;确保应⽤程序的可靠性和功能性⾄关重要。 随着软件系统复杂性的增加&#xff0c;有效测试⽅法的需求也在上升。 传统的测试⽤例⽣成⽅法通常⽆法满⾜快速开发周期和复杂代码库的需求。 随着进⼊⼈⼯智能&#xff08;AI&#xff09;时…

爬虫入门经典(七) | 采集淘宝电场相关信息

大家好&#xff0c;我是不温卜火&#xff0c;昵称来源于成语—不温不火&#xff0c;本意是希望自己性情温和。 PS&#xff1a;由于现在越来越多的人未经本人同意直接爬取博主本人文章&#xff0c;博主在此特别声明&#xff1a;未经本人允许&#xff0c;禁止转载&#xff01;&a…

Galxe已投资Pencils Protocol,投资者阵营正不断扩大

近日&#xff0c;Scroll 生态项目 Penpad 将品牌进一步升级为 Pencils Protocol&#xff0c;全新升级后其不仅对 LaunchPad 平台进行了功能上的升级&#xff0c;同时其也进一步引入了 Staking、Vault 以及 Shop 等玩法&#xff0c;这也让 Pencils Protocol 的叙事方向不再仅限于…

基础之音视频2

01 前言 02 mp 03 mp实例 简易音乐播放器 04 音频 sound-pool 1.作用 播放多个音频&#xff0c;短促音频 2.过程 加载load- 3.示例 模拟手机选铃声 步骤&#xff1a; 创建SoundPool对象&#xff0c;设置相关属性 音频流存入hashmap 播放音频 05 videoview 3gp 体积小 mp4 …

web安全学习笔记(15)

记一下第25-26课的内容。弱口令爆破的四种模式与判断成功失败的三种方案&#xff1b;爆破中的验证码拦截错误次数IP限制密码加密绕过 IP获取的原理以及绕过CDN获取客户真实IP 一、弱口令的分类 1.常规弱口令&#xff1a;如123456&#xff0c;666666&#xff0c;888888等 2.…

【软件测试】需求概念|软件的⽣命周期|开发模型|测试模型

目录 推荐 一、什么是需求 1.1 ⽤⼾需求 1.2 软件需求 二、开发模型 2.1 什么是“模型” 2.2 软件的⽣命周期 2.3 常⻅开发模型 2.3.1 瀑布模型 2.3.2 螺旋模型 2.3.3 增量模型、迭代模型 2.3.4 敏捷模型 2.4 测试模型 2.4.1 V模型 2.4.2 W模型(双V模型&#xff0…

使用RN的kitten框架的日历组件的修改

官方网页地址 下面就是我参考官方封装的时间日期组件&#xff08;主要是功能和使用方法&#xff0c;页面粗略做了下&#xff0c;不好看勿怪&#xff09; import React, {useState} from react; import {StyleSheet, View, TouchableOpacity, SafeAreaView} from react-native; …

FreeRTOS消息队列queue.c文件详解

消息队列的作用 消息队列主要用来传递消息&#xff0c;可以在任务与任务之间、中断与任务之间传递消息。 传递消息是通过复制的形式&#xff0c;发送方发送时需要不断复制&#xff0c;接收方接收时也需要不断复制。虽然会有内存资源的浪费&#xff0c;但是可以保证安全。 假…

Java项目:基于ssm框架实现的实验室耗材管理系统(B/S架构+源码+数据库+毕业论文+答辩PPT)

一、项目简介 本项目是一套基于ssm框架实现的实验室耗材管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 二、技术实现 jdk版本&#xff1a;1.8 …

2024年最新最全面的软件测试面试题(四)

1、在项目中如何保证软件质量? 项目质量不仅仅是某个人或某个团队来保障的&#xff0c;而是整个团队一起努力的结果&#xff0c;因此&#xff0c;在公司级别需要 有一个规范的项目流程。 产品&#xff0c;保证迭代过程中的产品逻辑&#xff0c;对于可能的兼容&#xff0c;升…