首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

客户端基本不用算法系列:并查集算法介绍(union-find

并查集算法(union-find) 接受了大家反馈,决定将之前图论告一段落,我在基础数据结构和数据处理场景下找一些好玩算法来写写。...他们友谊具有是传递性。如果已知 A 是 B 朋友,B 是 C 朋友,那么我们可以认为 A 也是 C 朋友。所谓朋友,是指所有朋友集合。 这题最后让我们求得集合数。...但是拍脑袋想,我们要遍历 N 次每个集合,真的是一个超级耗时办法。 那么什么更加优美的数据结构解决这类问题呢?其实就是今天要讲并查集(union-find)。 并查集是什么?...并查集是用来管理元素分组状况数据结构。并查集可以高效地执行如下操作。不过需要注意并查集虽然可以进行合并操作,但是无法进行分割操作。...类似于二叉树,我们同样可以通过一维数组实现,并查集也是如此。

76530

Union Find 并查集算法原理及应用

在线学习网站: https://labuladong.github.io/algo/ 读完本文,可以去力扣解决如下题目: 323. 无图中连通分量数目(中等) 130....这样,你应该大概明白什么是动态连通性了,Union-Find 算法关键就在于union和connected函数效率。那么用什么模型表示这幅图连通状态呢?用什么数据结构实现代码呢?...二、基本思路 注意我刚才把「模型」和具体数据结构」分开说,这么做是原因。因为我们使用森林(若干棵树)表示图动态连通性,用数组具体实现这个森林。 怎么用森林表示连通性呢?...竟然可以这样使用数组模拟出一个森林,如此巧妙解决这个比较复杂问题! 那么这个算法复杂度是多少呢?...但这个问题也可以Union-Find 算法解决,虽然实现复杂一些,甚至效率也略低,但这是使用 Union-Find 算法通用思想,值得一学。

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

朋友

他们友谊具有是传递性。如果已知 A 是 B 朋友,B 是 C 朋友,那么我们可以认为 A 也是 C 朋友。所谓朋友,是指所有朋友集合。...Union-Find 算法,也就是常说并查集算法,主要是解决图论中「动态连通性」问题。 问题介绍 简单说,动态连通性其实可以抽象成给一幅图连线。...这样,你应该大概明白什么是动态连通性了,Union-Find 算法关键就在于union和connected函数效率。那么用什么模型表示这幅图连通状态呢?用什么数据结构实现代码呢?...二、基本思路 注意我刚才把「模型」和具体数据结构」分开说,这么做是原因。因为我们使用森林(若干棵树)表示图动态连通性,用数组具体实现这个森林。 怎么用森林表示连通性呢?...我们设定树每个节点一个指针指向其父节点,如果是根节点的话,这个指针指向自己。

27210

Union-Find 并查集算法详解

判断这种「等价关系」非常实用,比如说编译器判断同一个变量不同引用,比如社交网络中朋友计算等等。...这样,你应该大概明白什么是动态连通性了,Union-Find 算法关键就在于union和connected函数效率。那么用什么模型表示这幅图连通状态呢?用什么数据结构实现代码呢?...二、基本思路 注意我刚才把「模型」和具体数据结构」分开说,这么做是原因。因为我们使用森林(若干棵树)表示图动态连通性,用数组具体实现这个森林。 怎么用森林表示连通性呢?...我们设定树每个节点一个指针指向其父节点,如果是根节点的话,这个指针指向自己。...至此,Union-Find 算法就基本完成了。是不是很神奇?竟然可以这样使用数组模拟出一个森林,如此巧妙解决这个比较复杂问题! 那么这个算法复杂度是多少呢?

1.1K20

东哥带你刷图论第五期:Kruskal 最小生成树算法

容易想到,一幅图可以很多不同生成树,比如下面这幅图,红色边就组成了两棵不同生成树: 对于加权图,每条边都有权重,所以每棵生成树都有一个权重和。...PS:一般来说,我们都是在无加权图中计算最小生成树,所以使用最小生成树算法现实场景中,图边权重一般代表成本、距离这样标量。...那么说到连通性,相信老读者应该可以想到 Union-Find 并查集算法,用来高效处理图中联通分量问题。...这样,最后mst集合中边就形成了最小生成树,下面我们看两道例题运用一下 Kruskal 算法。...:每个坐标点是一个二元组,那么按理说应该用五元组表示一条带权重边,但这样的话不便执行 Union-Find 算法;所以我们用 points 数组中索引代表每个坐标点,这样就可以直接复用之前 Kruskal

1.9K40

Union-Find 并查集算法详解

这样,你应该大概明白什么是动态连通性了,Union-Find 算法关键就在于union和connected函数效率。那么用什么模型表示这幅图连通状态呢?用什么数据结构实现代码呢?...二、基本思路 注意我刚才把「模型」和具体数据结构」分开说,这么做是原因。因为我们使用森林(若干棵树)表示图动态连通性,用数组具体实现这个森林。 怎么用森林表示连通性呢?...我们设定树每个节点一个指针指向其父节点,如果是根节点的话,这个指针指向自己。...竟然可以这样使用数组模拟出一个森林,如此巧妙解决这个比较复杂问题! 那么这个算法复杂度是多少呢?...算法复杂度可以这样分析:构造函数初始化数据结构需要 O(N) 时间和空间复杂度;连通两个节点union、判断两个节点连通性connected、计算连通分量count所需时间复杂度均为 O(1)

88230

图----深度优先搜索

使用深度优先搜索查找图中路径: 只需很简单修改深度优先遍历算法即可实现查找路径。添加一个实例变量edgeTo[]数组用来返回从每个与s相通顶点返回s顶点路径。...使用深度优先搜索找到图中所有的连通分量: 使用深度优先算法求解连通分量,递归第一次调用参数是顶点0,它会标记所有与0连通顶点。...然后构造函数中for循环会查找每个没有被标记顶点并递归调用dfs()标记和它相邻所有顶点。 添加了一个id[]数组,同一个连通分量中顶点id[]值相同。...marked[w]) dfs(G,w); } 深度优先遍历预处理使用时间和空间与V+E成正比且可以在常数时间内处理图连通性查询。...更重要union-find算法是一种动态算法(我们在任何时候都能用接近常数时间检查两个顶点是否连通,甚至在添加一条边时候),但深度优先算法必须对图进行预处理。

1K00

并查集专题

关于并查集题目不少,官方给数据是 30 道(截止 2020-02-20),但是一些题目虽然官方没有贴并查集标签,但是使用并查集来说确非常简单。...等式方程可满足性 看完这里内容,建议拿上面的题目练下手,检测一下学习成果。 概述 并查集是一种树型数据结构,用于处理一些不交集(Disjoint Sets)合并及查询问题。...一个联合-查找算法(Union-find Algorithm)定义了两个用于此数据结构操作: Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。...由于支持这两种操作,一个不相交集也常被称为联合-查找数据结构Union-find Data Structure)或合并-查找集合(Merge-find Set)。...如图两个司令: ? 我们将其合并为一个联通域,最简单方式就是直接将其中一个司令指向另外一个即可: ?

47150

【小码匠自习室】一道题3种解法:广搜+深搜+并查集,本宝宝困了,明天继续研究

“根”数量就足够了 Union-Find元素v是否为根可以通过uf.root(v) == v是否为真判断 基于以上,可以如下实现。...一个 N 个顶点和 M 个边图 G,其中第 i 条边连接第 A 顶点和第 B 顶点。连接 G 必须添加最小边数是多少? 为了解决这个问题,我们关注连接组件数量。...这样思考,我们可以看到,通过从两个不同连通分量中逐一选择顶点并添加连接两个顶点边,可以将连通分量数量减少一个。所以答案是(G 连通分量数)-1。 几种技术可以图中找到连通分量数量。...并查集(Union-FindUnion-Find是将每一组视为一棵树数据结构,通过两个顶点所属根是否相同来判断两个顶点是否在同一个组中。...在 C++ 情况下,可以使用 ACL dsu 轻松实现,可以通过包含 atcoder/all 或 atcoder/dsu 来使用

51820

加权无图----Kruskal算法实现最小生成树

上一篇:加权无实现 加权无图----Prim算法实现最小生成树 数据结构: 用一条优先队列将边按照权重从小到大排序 用union-find数据结构识别会形成环边 用一条队列保存最小生成树所有边...Kruskal算法计算一个含V个顶点和E条边连通加权无最小生成树所需空间与E成正比,所需时间与ElogE成正比(最坏情况)。...方法:将边都添加进最小优先权队列中,每次从中取出最小边,检查会不会与已经选出边构成环(使用union-find算法),如果构成环,则弃掉这条边,否则将这条边加入最小生成树队列。...for(Edge e: G.edges()) pq.insert(e);//将所有边添加进优先队列 UF uf = new UF(G.V()); //union-find...pq.isEmpty() && mst.size()<G.V()-1) { Edge e = pq.delMin();//从优先队列得到最小边 int

1K00

【算法】如何确定图(Graph)里有没有环(Cycle)?

判断无图中是否环 通过上面的定义可知,无论图还是无图中都存在环,但有环涉及到边方向,要比无图复杂。...因此,如果你在面试中被要求写一个算法“判断图中是否环”,首先就应该和面试官确认,要判断图还是无图。本文我们讲解是无图中是否判断!...在动手编程之前,我们首先要想清楚如何做,也就是说我们先要能够找到一个用自然语言可以描述办法,确定无图中是否环。...本文中讲内容比较多,介绍了三种方法:拓扑排序,DFS和Union-Find Set,每一种方法都可以判断无图或者图。...这种方法描述如下: 使用拓扑排序可以判断一个无图中是否存在环,具体步骤如下: 1. 求出图中所有节点度。 2. 将所有度 <= 1 节点入队。 3.

7.7K20

表示 今天主角是无图,顾名思义,无图就是边没有方向图。每当一个概念拿到程序中,总是需要抽象出一个数据结构表示这个概念。那么,图怎么表示呢?表示图这个数据结构叫做邻接表。...同时我们可以看到,如果要访问与顶点3相邻顶点,我们势必会先访问到2,然后是5,最后是9。但是对与顶点3说,和它相邻任何一个顶点低位都是相同,但这个先后顺序却是确定。...所以构造这个图时候,也就是构造这个邻接表时候就已经决定了我们操作图中结点时某些顺序。 对与领接表数组中元素,本身是一个链表,为了方便操作,我们用一个Bag类实现这个链表。...edgeTo[2]=1,表示1-2是第一次访问2时经过边。通过edgeTo这个数组我们可以还原出一个路径。除此之外,深度优先搜索还可以找出图中所有连通分量。...广度优先搜索 刚才说到深度优先搜索可以找到两个顶点之间一个路径,但当两个顶点之间多个路径时候,我们需要找出最短那一条时,深度优先搜索就束手无策了。此刻只能我们广度优先搜索出来亮亮相了。

84650

图解:什么是并查集?

隐藏与 Union-find 不相关细节;可以使用整数快速获取与对象相关信息(数组下标);可以使用符号表对对象进行转化。 简化有助于我们理解连通性本质。...如下图所示,图中共包含 63 个组,其中对象 u 和 对象 v 在同一个集合当中,我们可以找到一条从对象 u 到对象 v 路径(红色路线)但是我们并不关心这条路劲本身,只关心他们是否联通: ?...Union 命令:将包含两个对象集合替换为它们并集。 现在目标就是为 Union-Find 设计一个高效数据结构: Find 查询和 Union 命令可以混合使用。...概念优化 union 函数,我们把每一个数 id 看做是它父结点。...与 Quick-Find 算法使用一样数据结构,但是 id[] 数组具有不同含义: 大小为 整型数组 id[] 解释:id[i] 表示 i 父结点 i 根结点为 id[id[id[..

2.2K30

并查集(不相交集合)

一 概述 并查集(Disjoint set或者Union-find set)是一种树型数据结构,经常使用于处理一些不相交集合(Disjoint Sets)合并及查询问题。...一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构: Find:确定元素属于哪一个子集。它能够被用来确定两个元素是否属于同一子集。...了这些方法,很多经典划分问题能够被解决。 为了更加精确定义这些方法,须要定义怎样表示集合。 一种经常使用策略是为每一个集合选定一个固定元素,称为代表。以表示整个集合。 接着。...但在非常多情况下,我们一般选择两个集合之前代表中一个作为新代表。 三 不相交集合森林(根树表示集合) 不相交集合能够用链表实现。可是还有一种更快方法—–根树表示集合。...六 应用 并查集常作为还有一种复杂数据结构或者算法存储结构。常见应用:求无连通分量个数,近期公共祖先(LCA),带限制作业排序,实现Kruskar算法求最小生成树等。

65320

数据结构之并查集

并查集可以高效用来解决连接问题(Connectivity Problem),我们来看下面这样一张图: ? 可以看到,该图中有很多点,有些点之间连接,而有些点之间则没有连接。...那么此时就有一个问题是:这图中任意两个点是否可能通过一条路径连接起来。对于这个问题,我们使用并查集就可以高效求解,因为并查集可以非常快地判断网络中节点间连接状态。...根据这两个操作,我们可以定义出并查集接口了,这是因为并查集可以多种实现方式,这里定义接口做统一抽象: package tree.unionfind; /** * 并查集接口 * * @author...我们可以使用数组表示并查集中数据,数组中存放每个元素所在集合编号,例如 0 和 1。...然而即便是基于 rank 优化也无法避免数据量较大情况下导致树高度过高问题,所以我们就得使用路径压缩这种优化方式解决这个问题。 那么我们要如何进行路径压缩呢?

97820

什么是复杂度?如何降低复杂度?

同时,我们还将探讨如何在前端开发中使用ESLint和VS Code工具设置和检测复杂度。什么是复杂度?复杂度是由Thomas J....使用循环和迭代替代重复代码块重复代码块会增加代码复杂性和重复性。为了降低复杂度,可以使用循环和迭代替代重复代码块。...使用适当数据结构和算法选择适当数据结构和算法可以帮助降低代码复杂性和提高性能。例如,使用哈希表可以减少查找操作复杂度,使用排序算法可以提高搜索和比较效率。...在VS Code中,可以使用插件如ESLint、CodeMetrics等检测复杂度。安装ESLint插件后,可以在VS Code设置中配置复杂度阈值,并在编辑器中实时检测代码复杂度。...在前端开发中,使用ESLint和VS Code工具可以帮助我们设置和检测复杂度,并及时发现和解决代码中复杂性问题。通过合理代码设计和优化,我们可以编写出更简洁、高效和易于维护代码。

52710

图论算法基础(修订版)

那么,本文依然秉持我们风格,只讲「图」最实用,离我们最近部分,让你心里对图个直观认识,文末我给出了其他经典图论算法,理解本文后应该都可以拿下。...那你可能会问,我们这个图模型仅仅是「无权图」,不是还有什么加权图,无图,等等…… 其实,这些更复杂模型都是基于这个最简单图衍生出来加权图怎么实现?...把上面的技巧合起来,就变成了无加权图…… 好了,关于图基本介绍就到这里,现在不管什么乱七八糟图,你心里应该都有底了。 下面来看看所有数据结构都逃不过问题:遍历。...,可能走了一又回到这个节点。...当然,图还会有很多其他有趣算法,比如 二分图判定,环检测和拓扑排序(编译器循环引用检测就是类似的算法),最小生成树,Dijkstra 最短路径算法 等等,兴趣读者可以去看看,本文就到这了。

75720

如何使用并查集解决朋友问题?

Union-find algorithm),均表示相同数据结构或思想。...并查集是一种用来高效地判断 “动态连通性 ” 数据结构: 即给定一个无图,要求判断某两个元素之间是否存在相连路径(连通),这就是连通问题,也叫 “朋友” 问题。...并查集使用 “代表元法” 表示元素之间连接关系:将相互连通元素组成一个子集,并从中选取一个元素作为代表元。...典型例题 · 岛屿数量(二维) 前面我们讲的是一维连通性问题,那么在二维世界里连通性问题,并查集还依旧好用?...我们看 LeetCode 上另一道典型例题:LeetCode · 200.[5] LeetCode 例题 这个问题直接上 DFS 广度搜索自然是可以:遍历二维数组,每找到 1 后使用 DFS 遍历将所有相连

1.5K30

使用贪心算法解决最小生成树

,以及边两倍次减少key值,所以总时间为 image.png 使用斐波那契堆可以达到VlgV+E Kruskal's算法 核心思想:全局最小corssing cut边必定属于最小生成树,这个过程不能生成环...,需要追踪两个节点是否已经互相连接了 追踪数据结构Union-Find 结构,包含3个功能,Make-Set:创建一个集合;Find-Set:找到当前元素在那个集合;Union:合并集合 刚开始时候...T什么都没有 对每个节点v都执行一遍Make-Set 为了找到全局最小crossing cut,对整个边通过权值按照递增排序 按照增序遍历所有的边,如果两个节点u和v属于不同集合(crossing...cut),那么可以合并边T=TU{e},然后将这两个集合合并Union(u,v) 延伸阅读 Union-Find数据结构与Ackermann函数 时间分析 image.png 在使用Union-Find...数据结构基础上能够做到时间为O(ElgE+Eα(V)),假设权重为正整数而且最大值是个常量,那么排序可以达到常量时间,这个时候,算法所需要时间就是O(E),整体不Prims算法要好 最快MST

1.2K40

【算法提高班】并查集

关于并查集题目不少,官方给数据是 30 道(截止 2020-02-20),但是一些题目虽然官方没有贴并查集标签,但是使用并查集来说确非常简单。...等式方程可满足性[3] 大家可以学了模板之后去套用一下上面的三道题,做不出来可以看看我题解。...如果你对这个算法不是很明白,推荐看一下这篇文章Union-Find 算法详解[4],讲非常详细。 你可以把并查集元素看成部门的人,几个人可以组成一个部门个数。...(图来自 labuladong) 模板 这是一个我经常使用模板,我会根据具体题目做细小变化,但是大体是不变。...self.cnt -= 1 def connected(self, p, q): return self.find(p) == self.find(q) 大家可以根据情况使用不同模板

45920

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券