不相交集ADT(联机算法 + 脱机算法)

【0】README

0.1)本文总结于 数据结构与算法分析, 旨在分享 不相交集ADT的相关概念;
0.2) 不相交集ADT 的知识涉及到: 等价关系、动态等价关系、不相交集ADT相关操作及其数据结构 ,还有我们最后分享的 不相交集ADT的应用
0.3) 关于不相交集ADT的求并操作(find + union),参见 http://blog.csdn.net/pacosonswjtu/article/details/49717009 ;
0.4) 关于不相交集求并后的 路径压缩操作(源代码),参见 http://blog.csdn.net/PacosonSWJTU/article/details/49717109
0.5) 注意本文给出的 联机算法 + 脱机算法 的定义;


【1】 等价关系

1.1)若对于每一对元素(a,b), a, b ∈S, aRb 或者为true或者为false;则称在集合S上定义关系 R; 如果aRb 是 true , 我们说 a 与 b 是有关系的;
1.2)等价关系是满足下列三个性质的关系 R:

  • (自反性): 对于所有的 a ∈S, aRa;
  • (对称性): aRb当且仅当 bRa;
  • (传递性):若aRb且 bRC 则 aRc;

【2】 动态等价关系

2.1)给定一个等价关系“~”, 一个自然问题是对任意的 a和b, 确定是否 a~b;

  • 看个荔枝: 设在5个元素的集合 {a1, a2, a3, a4, a5} 上定义了一个等价关系, 此时存在25对元素, 它们的每一对有关系或者没有关系;

2.2)等价类:一个元素a∈S 的等价类是S 的一个子集, 它包含所有与a 有关系的元素;注意,等价类形成了对S 的一个划分:S的每一个成员恰好出现在了 一个等价类中;
2.3)为了确定是否 a~b: 我们只需要验证 a和b 是否都在同一个等价类中,就可以了;
2.4)不相交:初始数据最初是N个集合的类,每个集合一个元素,初始描述的是所有关系均为 false;

  • 2.4.1)此时有两种运算可以进行:

    • find操作(Find算法):它返回包含给定元素的集合(等价类)的名字;
    • 添加关系(合并操作,Union算法):如果我们想要添加关系a~b, 那么我们首先要看是否a和b已经有关系。这可以通过对a 和 b执行 find 操作来检验它们是否在同一个等价类中来完成;如果他们不再同一个类中, 那么我们使用 求并运算 Union, 吧含有a 和b 的两个等价类合并成一个新的等价类;

2.5)不相交集合的 Union/Find 算法:从集合观点来看, U的结果是建立一个新集合 Sk=Si U Sj, 去掉原来两个集合而保持所有的集合的不相交性;由于这个原因, 我们把这个工作的算法叫做 不相交集合的 Union/Find 算法
2.6)该算法是动态的:因为在算法执行过程中, 集合可以通过 Union 操作而发生改变;
2.7)联机算法 + 脱机算法:

  • 2.7.1)联机算法:这个算法是联机算法,当Find执行时, 它必须给出答案算法才能继续进行;
  • 2.7.2)脱机算法:该算法需要观察全部的Union 和 Find 序列, 它对每个Find给出的答案必须和所有执行到该Find的Union一致, 而该算法在看到所有的问题以后再给出它的所有答案;
  • 2.7.3)联机和脱机算法的举例说明: 这种差别类似于参加一次笔试(它一般是脱机的, 你只能在规定时间内做完) 和一次口试( 因为你必须回答当前的问题, 然后才能继续下一个问题);

2.8)解决动态等价问题的方法有两种:

  • 2.8.1)保证指令 Find 能够以常数最坏情况运行时间执行;
  • 2.8.2)保证指令Union 能够以常数最坏运行时间执行; 但以上二者不能同时做到;

【3】 基本数据结构

3.1)我们的问题不要求 Find 操作返回任何特定的名字,而只是要求 当且仅当两个元素属于相同的集合时, 作用在这两个元素上的 Find 返回相同的名字;
3.2)对Union(X,Y) 和 Find(X)操作的约定:

  • 3.2.1)我们采纳了在 Union(X,Y)后的新的根是 X 的约定;
  • 3.2.2)对元素X 的一次Find(X)通过返回包含 X 的树的根而完成;执行这次操作花费的时间与表示X 的节点的深度成正比;
  • 3.2.3)通过以上所定义的操作, 能够建立一颗深度为 N-1 的树,使得一次 Find的最坏情形运行时间为 O(N);M次连续操作在最坏情形下可能花费 O(MN)时间;

3.3)对一些列操作的二次运行时间一般是不可接受的, 有幸的是, 有几种方法容易保证这样的运行时间不会出现;


【4】 一个应用

4.1)出现的问题: 我们有一个计算机网络和一个双向连接表,每一个连接可将文件从一台计算机传送到另一台计算机。那么,能否将一个文件从网络上的任意一台计算机发送到任意的另一台计算机上去呢? 一个附加的限制是要求该问题必须联机解决;因此,这个连接表要一次一个地给出,而该算法那则必须能够在任一时刻给出答案;
4.2)解决方法:

  • 4.2.1)我们要求两台计算机可以传输文件当且仅当他们在同一个集合中;可以看出,传输文件的能力形成一个等价关系。此时我们一次一个地读入连接。当我们读入某个连接如(u,v)时, 我们测试是否 u 和 v 在同一个集合中,如果他们在同一个集合中,则什么也不做;如果不在的话,那么将他们所在的两个集合合并;
  • 4.2.2)在算法的最后: 所得到的图连通当且仅当恰好存在一个集合。 如果存在M个链接 和 N台 计算机, 那么空间的需求则是 O(N);使用 按大小求并 和 路径压缩 的方法,我们得到最坏运行时间为 O(Mα(M,N)), 因为存在2M次Find 和 至多N-1次Union, 这个运行时间是线性的;

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

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

相关文章

win7无法连接打印机拒绝访问_Win7系统”windows无法连接到打印机拒绝访问“怎么办?通过创建local port端口连接来搞定...

随着电脑的使用率越来越高,我们有时候可能会遇到Win7系统”windows无法连接到打印机拒绝访问“的问题,要怎么处理呢?详细解决方法如下:故障现象:按照XP的方式添加打印机,总是会出现“windows无法连接到打印…

spring boot测试_测试Spring Boot有条件的合理方式

spring boot测试如果您或多或少有经验的Spring Boot用户,那么很幸运,在某些时候您可能需要遇到必须有条件地注入特定bean或配置的情况 。 它的机制是很好理解的 ,但有时这样的测试条件下(以及它们的组合)可能会导致混乱…

不相交集的求并算法(按集合大小求并+按高度求并)

【0】README 0.1)本文总结于 数据结构与算法分析, 但源代码均为原创,旨在实现 不相交集ADT的两个操作:合并集合union查找集合find; 0.2) 不相交集ADT 的 Introduction , 参见 http://blog.csd…

及时复盘的好处_该如何复盘 先来说说复盘的好处: 复盘的好处简直太多了!就像你学习一样有一个总结的过程,复盘的最直接好处就是增强你的“股感”!在股市... - 雪球...

来源:雪球App,作者: 孜孜金融,(https://xueqiu.com/3493013654/135651359)先来说说复盘的好处:复盘的好处简直太多了!就像你学习一样有一个总结的过程,复盘的最直接好处就是增强你的“股感”&am…

posman mocks_使用Mocks进行需求驱动的软件开发

posman mocksjmock作者撰写的有关模拟框架的优秀论文 。 本文写于18年前的2004年,但其中有许多构建可维护软件系统的技巧。 在这篇文章中,我将重点介绍本文中的关键思想,但建议您阅读本文以获取有关模拟和编程实践的重要思想。 模拟对象是测…

不相交集合求并的路径压缩

【0】README 0.1)本文总结于 数据结构与算法分析, 源代码均为原创, 旨在实现 对不相交集合的路径压缩操作; 0.2)对求并后的集合进行路径压缩,目的是降低集合(合并树)的深度&#x…

python 动态加载与静态加载_python中的元类、静态方法、类方法,动态添加方法...

首先介绍几个概念:1、#所谓的静态方法就是这个方法任何类都可以调用,程序一加载就存在的方法2、所谓的类方法就是这个类一加载就存在的方法,不用实例化这个类就已经存在的方法3、所谓的元类就是创建类的类元类: type我们知道对象是…

flutter调用api_如何在Flutter(REST API)中进行API调用

flutter调用api在本文中,我们将看一下如何快速进行API调用并使用简单的REST API。 在这里查看我在Flutter上的其他一些帖子: Flutter vs React Native 了解Flutter中的BLoC架构 (强烈建议) 在Flutter中构建ListView&#xff0…

java重载与重写的区别+重写父类equals方法的完美实现

【0】README 0.1) 本文章节【1】和【2】的内容转自 http://www.cnblogs.com/bluestorm/archive/2012/03/01/2376236.html ; 旨在区分重载与重写以及他们的相关概念; 0.2) 本文章节【3】的内容转自 http://blog.csdn.net/pacoson…

checkpoint_通过Main的Checkpoint Restore加快Java启动速度

checkpointJava虚拟机为已编译为字节码 (但不一定是用Java编写)的应用程序提供了托管运行时环境。 与为特定平台静态编译的代码相比,这为应用程序开发人员提供了许多好处,并且通常可以提高性能。 JVM通过垃圾回收器 (G…

泛型数组列表ArrayList

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理清 java 中的 数组列表 ArrayList; 【2】数组列表 ArrayList 2.1)ArrayList: ArrayList 具有自动调节数组容量的功能, 而不需要为此…

大数据聚类分析用于预测_多模态数据中的非负矩阵分解用于分割和标签预测

引用Akata Z, Thurau C, Bauckhage C. Non-negative matrix factorization in multimodality data for segmentation and label prediction[C]. 2011.摘要随着 Internet 上带注释的多媒体数据的可用性不断提高,要求有一种技术可以实现不同类型数据的原则性联合处理。…

程序员 rs编码_为什么声明性编码使您成为更好的程序员

程序员 rs编码在许多情况下,具有功能组成的声明式解决方案提供了优于传统命令式代码的出色代码指标。 阅读本文并了解如何使用具有功能组成的声明性代码成为一名更好的程序员。 在本文中,我们将仔细研究三个问题示例,并研究用于解决这些问题…

对象包装器与自动(拆箱)装箱+参数数量可变的方法+枚举类

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理解 自动拆箱(装箱)、printf的参数数量可变 以及 枚举类的详细说明; 0.2) 源代码: https://github.com/pacosonTang/core…

go 监测tcp 连接断开_TCP三次握手和四次挥手以及11种状态

三次握手置位概念:根据TCP的包头字段,存在3个重要的标识ACK、SYN、FINACK:表示验证字段 SYN:位数置1,表示建立TCP连接 FIN:位数置1,表示断开TCP连接三次握手过程说明:1.由客户端发送…

java序列化深克隆_如何在内存序列化中使用Java深克隆对象

java序列化深克隆在我以前的文章中,我解释了深度克隆和浅层克隆之间的区别 , 以及复制构造函数和防御性复制方法比默认的Java克隆如何更好。 使用复制构造函数和防御性复制方法进行的Java对象克隆当然具有某些优势,但是我们必须显式编写一些…

java反射机制+继承设计技巧

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理解 java反射机制 ;最后还顺带提出了 继承设计的技巧; 【1】反射相关 1)反射定义:能够分析类能力的程序称为反射; 2&…

60秒计时器的仿真电路_基于伏秒平衡的同步整流方案探讨

为了提高电源的效率和功率密度,尤其是低输出电压的应用场合,同步整流是不可或缺的。图1-1 反激输出二极管损耗比如上图的反激电源如果输出二极管 Vf0.7V,输出电压 Vout3V 则效率不会高于3/(30.7)81%。为了提升效率一般会选用低导通压降的肖特…

利用反射机制创建新类的两种方式及比较

【0】README 0.1) 本文描述源代码均 转自 http://blog.csdn.net/fenglibing/article/details/4531033 , 旨在深入理解 如何利用反射机制创建类实例; 0.2) 转载的源代码,参见 https://github.com/pacosonTang/core-ja…

如何设计高效测试用例_高效的企业测试-单元和用例测试(2/6)

如何设计高效测试用例在本系列的第一部分中,我们看到了有效测试应满足的一些普遍适用的原则和约束。 在这一部分中,我们将仔细研究代码级单元测试和组件或用例测试。 单元测试 单元测试验证单个单元(通常是类)的行为&#xff0c…