算法——union-find 前言 零基础直接刷力扣还是有些虎了,所以特意补一下理论知识。...uf.union(p, q); System.out.println(p + " " + q); } sc.close(); } } 关键实现 在 union-find
简介 今天跟大家分享一个算法,如题union-find。这个算法要解决的就是一个动态连通性问题,什么是动态连通性呢?
预计阅读时间:10 分钟 上篇文章 Union-Find 并查集算法详解 很多读者对于 Union-Find 算法的应用表示很感兴趣,这篇文章就拿几道 LeetCode 题目来讲讲这个算法的巧妙用法。...一、DFS 的替代方案 很多使用 DFS 深度优先算法解决的问题,也可以用 Union-Find 算法解决。...这个问题也可以用 Union-Find 算法解决,虽然实现复杂一些,甚至效率也略低,但这是使用 Union-Find 算法的通用思想,值得一学。...这就是 Union-Find 的核心思路,明白这个图,就很容易看懂代码了: 首先要解决的是,根据我们的实现,Union-Find 底层用的是一维数组,构造函数需要传入这个数组的大小,而题目给的是一个二维棋盘...很多更复杂的 DFS 算法问题,都可以利用 Union-Find 算法更漂亮的解决。LeetCode 上 Union-Find 相关的问题也就二十多道,有兴趣的读者可以去做一做。
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一...
预计阅读时间: 10 分钟 今天讲讲 Union-Find 算法,也就是常说的并查集算法,主要是解决图论中「动态连通性」问题的。名词很高端,其实特别好理解,等会解释,另外这个算法的应用都非常有趣。...说起这个 Union-Find,应该算是我的「启蒙算法」了,因为《算法4》的开头就介绍了这款算法,可是把我秀翻了,感觉好精妙啊!...比如下面这幅图,总共有 10 个节点,他们互不相连,分别用 0~9 标记: 现在我们的 Union-Find 算法主要需要实现这两个 API: class UF { /* 将 p 和 q 连接...这样,你应该大概明白什么是动态连通性了,Union-Find 算法的关键就在于union和connected函数的效率。那么用什么模型来表示这幅图的连通状态呢?用什么数据结构来实现代码呢?...int p, int q) { int rootP = find(p); int rootQ = find(q); return rootP == rootQ; } 至此,Union-Find
一.并查集及其优化 - 并查集:由若干不相交集合组成,是一种简单但是很好用的数据结构,拥有优越的时空复杂性,一般用于处理一些不相交集合的查询和合并问题。 ...
Union-Find(又称 并查集)是一种高效解决 动态连通性问题 的算法。它主要提供两种操作:Union(x, y):将元素 x 和 y 连接。...1、问题背景Union-Find 算法又称不交并集算法,是一种用于维护一组元素之间不相交集合的算法。...在实际应用中,Union-Find 算法可以用来解决多种问题,例如判断两个元素是否属于同一个集合、将两个集合合并为一个集合等。...2、解决方案Python 中 Union-Find 算法有两种实现方法:使用数组和使用字典。使用数组实现 Union-Find 算法时,每个元素的父节点存储在一个数组中。...下面是使用 Python 实现 Union-Find 算法的示例代码:def union_find_array(lis): """ 使用数组实现 Union-Find 算法。
来源:labuladong 作者:labuladong 今天讲讲 Union-Find 算法,也就是常说的并查集算法,主要是解决图论中「动态连通性」问题的。...说起这个 Union-Find,应该算是我的「启蒙算法」了,因为《算法4》的开头就介绍了这款算法,可是把我秀翻了,感觉好精妙啊!...现在我们的 Union-Find 算法主要需要实现这两个 API: class UF { /* 将 p 和 q 连接 */ public void union(int p, int q...这样,你应该大概明白什么是动态连通性了,Union-Find 算法的关键就在于union和connected函数的效率。那么用什么模型来表示这幅图的连通状态呢?用什么数据结构来实现代码呢?...至此,Union-Find 算法就基本完成了。是不是很神奇?竟然可以这样使用数组来模拟出一个森林,如此巧妙的解决这个比较复杂的问题! 那么这个算法的复杂度是多少呢?
定义union-find算法API: public class UF{ UF(int N) 初始化N个触点
今天,跟大伙儿分享一个比较俗气,但是却非常高效实用的算法,如标题所示Union-Find,是研究关于动态连通性的问题。不保证我能清晰的表述并解释这个算法,也不保证你可以领会这个算法的绝妙之处。
深度优先搜索和union-find算法比较: 理论上,深度优先算法比union-find快,因为它能够保证所需时间是常数而union-find算法不行。...实际上,union-find算法更快,因为它不需要完整的构造并表示一张图。...更重要的是union-find算法是一种动态算法(我们在任何时候都能用接近常数的时间检查两个顶点是否连通,甚至在添加一条边的时候),但深度优先算法必须对图进行预处理。
并查集是一种用途广泛的数据结构,能够快速地处理集合的合并和查询问题,并且实现起来非常方便,在很多场合中都有着非常巧妙的应用,。 本文首先介绍并查集的定义、原理及...
在讲 Kruskal 算法之前,需要回顾一下 Union-Find 并查集算法。...Union-Find 并查集算法 刚才说了,图的生成树是含有其所有顶点的「无环连通子图」,最小生成树是权重和最小的生成树。...那么说到连通性,相信老读者应该可以想到 Union-Find 并查集算法,用来高效处理图中联通分量的问题。...前文 Union-Find 并查集算法详解 详细介绍了 Union-Find 算法的实现原理,主要运用size数组和路径压缩技巧提高连通分量的判断效率。...如果不了解 Union-Find 算法的读者可以去看前文,为了节约篇幅,本文直接给出 Union-Find 算法的实现: class UF { // 连通分量个数 private int
题目 C - Connect Cities https://atcoder.jp/contests/abl/tasks/abl_c 标签 AtCoder、BFS、Union-Find、DFS 問題描述...Union-Find 说到组,Union-Find。Union-Find 允许对连接的组件进行有效分组。...具体来说,对于每条边 (u,v), 代码 uf.merge(u, v); 最后,在计算组数时,请执行以下操作: Union-Find 中的每个组都是一棵有根树 因此,在Union-Find的元素中找到...“根”的数量就足够了 Union-Find中的元素v是否为根可以通过uf.root(v) == v是否为真来判断 基于以上,可以如下实现。...并查集(Union-Find) Union-Find是将每一组视为一棵树的数据结构,通过两个顶点所属的树的根是否相同来判断两个顶点是否在同一个组中。
上一篇:加权无向图的实现 加权无向图----Prim算法实现最小生成树 数据结构: 用一条优先队列将边按照权重从小到大排序 用union-find数据结构来识别会形成环的边 用一条队列来保存最小生成树的所有边...方法:将边都添加进最小优先权队列中,每次从中取出最小的边,检查会不会与已经选出的边构成环(使用union-find算法),如果构成环,则弃掉这条边,否则将这条边加入最小生成树队列。...for(Edge e: G.edges()) pq.insert(e);//将所有边添加进优先队列 UF uf = new UF(G.V()); //union-find
但这个问题也可以用 Union-Find 算法解决,虽然实现复杂一些,甚至效率也略低,但这是使用 Union-Find 算法的通用思想,值得一学。...这就是 Union-Find 的核心思路,明白这个图,就很容易看懂代码了。...首先要解决的是,根据我们的实现,Union-Find 底层用的是一维数组,构造函数需要传入这个数组的大小,而题目给的是一个二维棋盘。...力扣第 990 题「等式方程的可满足性」用 Union-Find 算法就显得十分优美了,题目是这样: 给你一个数组equations,装着若干字符串表示的算式。...最后,Union-Find 算法也会在一些其他经典图论算法中用到,比如判断「图」和「树」,以及最小生成树的计算,详情见 Kruskal 最小生成树算法。
并查集算法(union-find) 接受了大家的反馈,决定将之前的图论告一段落,我在基础的数据结构和数据处理的场景下找一些好玩的算法来写写。...其实就是今天要讲的并查集(union-find)。 并查集是什么? 并查集是用来管理元素分组状况的数据结构。并查集可以高效地执行如下操作。
并查集概述 并查集算法,主要是解决图论中「动态连通性」问题的 Union-Find 算法解决的是图的动态连通性问题,这个算法本身不难,能不能应用出来主要是看你抽象问题的能力,是否能够把原始问题抽象成一个有关图论的问题...如果你对这个算法不是很明白,推荐看一下这篇文章Union-Find 算法详解[4],讲的非常详细。 你可以把并查集的元素看成部门的人,几个人可以组成一个部门个数。...problems/satisfiability-of-equality-equations/solution/mo-ban-ti-bing-cha-ji-python3-by-fe-lucifer/ [4] Union-Find
由于支持查询和合并这两种操作,并查集在英文中也被称为联合-查找数据结构(Union-find data structure)或者合并-查找集合(Merge-find set)。...隐藏与 Union-find 不相关的细节;可以使用整数快速获取与对象相关的信息(数组的下标);可以使用符号表对对象进行转化。 简化有助于我们理解连通性的本质。...上面的问题看似很复杂,但也很容易抽象为 Union-Find 模型: 对象。 对象的不相交集(Disjoint Set)。 Find 查询:两个对象是否在同一集合中?...Find 操作: Union 操作: Union-Find Union-Find 算法是在 Weighted Quick-Union 的基础之上进一步优化,即路径压缩的 Weighted Quick-Union...而 Union-Find 算法是通过路径压缩进一步将 Weighted Quick-Union 算法的树高降低。
使用斐波那契堆可以达到VlgV+E Kruskal's算法 核心思想:全局最小的corssing cut边必定属于最小生成树,这个过程不能生成环,需要追踪两个节点是否已经互相连接了 追踪的数据结构是 Union-Find...对整个的边通过权值按照递增来排序 按照增序遍历所有的边,如果两个节点u和v属于不同的集合(crossing cut),那么可以合并边T=TU{e},然后将这两个集合合并Union(u,v) 延伸阅读 Union-Find...数据结构与Ackermann函数 时间分析 image.png 在使用Union-Find数据结构的基础上能够做到时间为O(ElgE+Eα(V)),假设权重为正整数而且最大值是个常量,那么排序可以达到常量的时间
领取专属 10元无门槛券
手把手带您无忧上云