首页
学习
活动
专区
圈层
工具
发布

算法——union-find

、对称性如果 p 和 q 是相连的,那么 q 和 p 也是相连的。与传递性如果 p 和 q 是相连的且 q 和 r 是相连的,那么 p 和 r 也是相连的。。...现程序从输入中读取一对整数 p 和 q ,假设 p 和 q 都存在于已知序列中,若序列中对应整数相连,则不做操作,若序列中对应整数不相连,则将他们相连,并将 p 和 q 输出。...此外因为 union_find 类的实现必须基于初始序列,因此我们将初始化方法 uinon_find() 定义为不可选的构造方法。...find() 方法负责查找并返回整数所在块的标识, union() 方法负责连接两个不相连的整数。如何实现这两个方法取决于我们如何标识特定的块,在基础实现中我们将标识存储在数组中,并以整数值作索引。...基于这个思路,find() 方法只需要返回以当前整数为索引的对应数组元素即可: public int find(int p) {return id[p];} 而连接和维护标识的操作则全部交给了 union

48310

算法——union-find

简介 今天跟大家分享一个算法,如题union-find。这个算法要解决的就是一个动态连通性问题,什么是动态连通性呢?...判断两个触点i和j是否相连,就看id[i]和id[j]的值是否相等。最开始每个触点各成一个分量,于是都各不相连。...今天主要需要讨论的就是find和union的不同实现。上面这个实现被称为quick-find,顾名思义,显然find()方法的速度是很快的,它只需要访问id数组一次。...count--; } 在quick-union这个实现中,union()不再需要遍历整个数组,看起来要比quick-find快很多。...()方法中加了一行代码,这行代码的用处就是将p的父节点设置成他的爷爷节点,最终P就会直接连在根节点上,从而路径被压缩,再次提高了效率。

47530
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    并查集(Union Find)

    ,它支持以下运算: union(A,B):将集合A和集合B合并 find(x):找出包含元素x的集合 connected(A,B):返回A和B是否连通 我们看一张图来具体说明 ?  ...分析以上API,方法connected和union都依赖于find,connected对两个参数调用两次find方法,而union在真正执行union之前也需要判断是否连通,这又是两次调用find方法,...在实现上,其它的方法都一样,只有find和union这两个方法有所不同 public int find(int p) { //根节点具有性质:root = id[root] while(...这是十分有意义的,因为在Quick-Union算法中的任何操作,都不可避免的需要调用find方法,而该方法的执行效率依赖于树的高度。...树的高度减小了,find方法的效率就增加了,从而也就增加了整个Quick-Union算法的效率。

    1.2K10

    并查集(Union Find)

    本文设计的并查集主要支持两个操作: union(p,q) 并,对传入的两个数据p和q,在并查集内部将这两个数据,以及这两个数据所在的集合合并起来。...第一种实现   表示每一个元素都属于不同的集合,没有任意两个元素是相连的 public class UnionFind01 implements UF { //我们第一种实现,Union-Find...id.length; i++){ if (id[i] == pID) id[i] = qID; } } } 第二种实现   我们的第二版Union-Find...find(q); } // 合并元素p和元素q所属的集合 // O(h)复杂度, h为树的高度 @Override public void unionElements...基于前面的四种实现方式,我们会发现下图中的三颗并查集数,无论是find()还是isConnected()都是等效的   由于并查集的查找方法是和树得高度相关的,所以我们只要让树得高度降低,就都是对并查集的优化

    35210

    Union-Find 算法怎么应用?

    预计阅读时间:10 分钟 上篇文章 Union-Find 并查集算法详解 很多读者对于 Union-Find 算法的应用表示很感兴趣,这篇文章就拿几道 LeetCode 题目来讲讲这个算法的巧妙用法。...3、在find函数中进行路径压缩,保证任意树的高度保持在常数,使得union和connectedAPI 时间复杂度为 O(1)。 有的读者问,既然有了路径压缩,size数组的重量平衡还需要吗?...解决这个问题的传统方法也不困难,先用 for 循环遍历棋盘的四边,用 DFS 算法把那些与边界相连的O换成一个特殊字符,比如#;然后再遍历整个棋盘,把剩下的O换成X,把#恢复成O。...这个问题也可以用 Union-Find 算法解决,虽然实现复杂一些,甚至效率也略低,但这是使用 Union-Find 算法的通用思想,值得一学。...我们前文说过,动态连通性其实就是一种等价关系,具有「自反性」「传递性」和「对称性」,其实==关系也是一种等价关系,具有这些性质。所以这个问题用 Union-Find 算法就很自然。

    62010

    Excel VBA之Find

    Excel VBA之Find expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase,...请记住搜索是从该单元格之后开始的;直到本方法绕回到指定的单元格时,才对其进行搜索。如果未指定本参数,搜索将从区域的左上角单元格之后开始。 LookIn Variant 类型,可选。信息类型。...("金额合计", , , ,1) MsgBox "在编绩效-金额合计:" & ng.Row MsgBox "试用-金额合计:"& Sheets("试用").Cells.Find("金额合计", ,..." &Cells.Find("*", , , , 2, 2).Column End Sub ★★ Find 常常与FindNext配合使用,下一次再学习FindNext吧!...).End(xlUp).Row MsgBox "1行最后1列:" &Range("XFD1").End(xlToLeft).Column ’’’’’’’’’’’’’’’’’’’’数据使用区域的最大行数和最大列数号

    3.2K20

    利用Python实现Union-Find算法

    Union-Find(又称 并查集)是一种高效解决 动态连通性问题 的算法。它主要提供两种操作:Union(x, y):将元素 x 和 y 连接。...2、解决方案Python 中 Union-Find 算法有两种实现方法:使用数组和使用字典。使用数组实现 Union-Find 算法时,每个元素的父节点存储在一个数组中。...下面是使用 Python 实现 Union-Find 算法的示例代码:def union_find_array(lis): """ 使用数组实现 Union-Find 算法。​...(lis)print(parents_array)print(parents_dict)上述代码中,union_find_array() 函数和 union_find_dict() 函数分别使用数组和字典实现了...find() 函数和 union() 函数分别是 Union-Find 算法中查找元素父节点和将两个集合合并为一个集合的函数。

    26910

    有趣的算法(六) ——Find-Union算法

    有趣的算法(六)——Find-Union算法 (原创内容,转载请注明来源,谢谢) 一、场景 Find-Union解决一类问题: 1、武林帮派 假设有n个武林帮派,当两个帮派是合作的时候,人员不会互相打架...二、分析 解决问题的关键,在于连接、判断是否已连接,这也就是find、union两个词的精髓。可以通过数组存放对应关系,每个数组的下标表示当前的点,可以利用数组进行find和union的操作。...三、解决方案 1、方法一:quick-find 第一个想法,id[i]存放的是第i个元素所属的组,初始id[i]=i。...当数组元素非常多的情况下,union将非常慢。 2、方法二:quick-union 为了加快union,现换一种思路。id[i]的值表示的是节点i的父节点。...4、方法四:压缩路径的加权quick-union 方法三的速度已经很快,还有一个地方可以进行微调。即每次find的时候,由于其都在追溯父节点,则可以把每次追溯到的父节点,都指向要连接的那个根节点。

    1K40

    Union-Find 并查集算法详解

    比如下面这幅图,总共有 10 个节点,他们互不相连,分别用 0~9 标记: 现在我们的 Union-Find 算法主要需要实现这两个 API: class UF { /* 将 p 和 q 连接...这样,你应该大概明白什么是动态连通性了,Union-Find 算法的关键就在于union和connected函数的效率。那么用什么模型来表示这幅图的连通状态呢?用什么数据结构来实现代码呢?...我们发现,主要 APIconnected和union中的复杂度都是find函数造成的,所以说它们的复杂度和find一样。 find主要功能就是从某个节点向上遍历到树根,其时间复杂度就是树的高度。...这样我们可以修改一下union方法: public void union(int p, int q) { int rootP = find(p); int rootQ = find(q)...这样find就能以 O(1) 的时间找到某一节点的根节点,相应的,connected和union复杂度都下降为 O(1)。

    1.1K30

    Union-Find 并查集算法详解

    现在我们的 Union-Find 算法主要需要实现这两个 API: class UF { /* 将 p 和 q 连接 */ public void union(int p, int q...这样,你应该大概明白什么是动态连通性了,Union-Find 算法的关键就在于union和connected函数的效率。那么用什么模型来表示这幅图的连通状态呢?用什么数据结构来实现代码呢?...我们发现,主要 APIconnected和union中的复杂度都是find函数造成的,所以说它们的复杂度和find一样。 find主要功能就是从某个节点向上遍历到树根,其时间复杂度就是树的高度。...这样我们可以修改一下union方法: public void union(int p, int q) { int rootP = find(p); int rootQ = find(q)...这样find就能以 O(1) 的时间找到某一节点的根节点,相应的,connected和union复杂度都下降为 O(1)。

    1.2K20

    有一种算法叫做“Union-Find”?

    然后,我们需要2个函数find(int x)和union(int p,int q)。前者返回点“x”所属于的连通分量,后者将p,q两点进行连接。...-------------------- 2.Union-find进阶: 仔细一想,我们上面再进行union()连接操作时,实际上就是一个进行暴力“标记”的过程,即把所有连通分量id跟点q相同的点找出来...结合本算法对quick-find()的优化,我们把它称为“quick-union”算法。 -------- 3.Union-Find再进阶   等等,还没完!...下图中,数据增加了“6-2”的一条连接,得知以“2”为根节点的树比“6”的树大,对比(f)和(g)两种连接方式,我们最优选择应该是(g),即把小树并到大树下。   ...() union() 总时间复杂度 quick-find O(M) O(l) O(N) O(M*N) quick-union O(M) O(lgN~N) O(l) O(M*N)极端 WeightedUF

    38330

    union和union all的区别

    一、区别1:取结果的交集 1、union: 对两个结果集进行并集操作, 不包括重复行,相当于distinct, 同时进行默认规则的排序; 2、union all: 对两个结果集进行并集操作, 包括重复行..., 即所有的结果全部显示, 不管是不是重复; 二、区别2:获取结果后的操作 1、union: 会对获取的结果进行排序操作 2、union all: 不会对获取的结果进行排序操作 三、区别3: 建立表脚本...看到结果中去重和排序结果 SELECT * FROM student UNION SELECT * FROM student2 查询返回数据视图 id username sex...all 结果中的结果合并 SELECT * FROM student UNION ALL SELECT * FROM student2 查询返回数据视图 id username...all只是合并查询结果,并不会进行去重和排序操作,在没有去重的前提下,使用union all的执行效率要比union高

    1K10
    领券