Disjoint Set,不相交集,也叫并查集
Union/Find算法:
Find:它返回包含给定元素的集合。
Union:合并两个集合。
用数组来模拟树。
初始化时,数组元素为0。正数的表示父亲是谁,如图:
Union优化:每个根的数组元素包含它的树的高度的负值,按树的高度合并,这样任何节点的深度均不会超过 logN。
第一个数组图是按大小合并,第二个数组图是按高度合并。
按树高度合并代码
typedef int DisjSet[128];
typedef int SetType;
typedef int ElementType;
void SetUnion(DisjSet S, SetType Root1, SetType Root2)
{
if (S[Root2] < S[Root1]) /* Root2 is deeper set */
S[Root1] = Root2; /* Make Root2 new root */
else
{
if (S[Root1] == S[Root2]) /* Same height, */
S[Root1]--; /* so update */
S[Root2] = Root1;
}
}
Find优化:路径压缩,每执行一次Find操作,从X到根的路径上的每一个节点都使它的父节点变成根。
路径压缩与按大小合并完全兼容,但不完全与按高度合并兼容,此时,可用估计的高度(秩)。
SetType Find(ElementType X, DisjSet S)
{
if (S[X] <= 0)
return X;
else
return S[X] = Find(S[X], S); // 与普通Find不同在于多了:"S[X] = "
}
来自《数据结构与算法分析》
分享到:
相关推荐
ACM disjoint set
不相交 于Python的 (又称联合查找数据结构或合并查找集)实现。 先决条件 唯一的要求是安装Python 3,您可以通过运行以下命令进行验证: $ python --version Python 3.7.2 ...>> > ds = DisjointSet ()
在计算机科学中,**离散集合(Disjoint Set)** 是一种用于管理元素分组的数据结构。它支持两种主要操作:`union` 和 `find`。`union` 操作用于合并两个集合,而 `find` 操作用于确定元素属于哪个集合。离散集合数据...
### ACM并查集(Disjoint Set)知识点梳理 #### 导引问题 - **问题背景**:在一个城市中,有n个人,这些人之间要么是朋友关系,要么是敌人关系。根据两条规则:“我朋友的朋友是我的朋友”、“我敌人的敌人也是我的...
var unionFind = new DisjointSet ( nodes ); // check intersections between scopes of given objects unionFind . Find ( Node1 , Node2 ) // union scopes unionFind . Union ( Node1 , Node2 ) 执照
3. **并查集**:为了确保生成的树不包含环路,我们需要使用并查集(Disjoint Set)数据结构。在MATLAB中,可以实现一个简单的并查集,包括“找父”(Find Parent)和“联合”(Union)操作。每次添加边时,我们都要...
const DisjointSet = require('ml-disjoint-set'); let ds = new DisjointSet(); ds.add('a'); ds.add('b'); ds.union('a', 'b'); // 合并'a'和'b'到同一集合 console.log(ds.connected('a', 'b')); // 输出:true...
不相交集 Java 数据结构实现 用法 org.nnsoft.trudeau.collections.disjointset.DisjointSet是一个泛型友好的数据结构,它提供E find( E e )和void union( E e1, E e2 ) 。
在计算机科学领域,特别是数据结构的研究中,**Union-Find**(并查集)是一种用于处理一些不交集(Disjoint Sets)合并及查询问题的重要数据结构。这种数据结构能够高效地支持两种基本操作:查找(Find)和合并...
var DisjointSet = require ( 'disjointset' ) ; var edges = [ { v : 0 , u : 1 , w : 7 } , { v : 0 , u : 3 , w : 5 } , { v : 1 , u : 2 , w : 8 } , { v : 1 , u : 3 , w : 9 } , { v : 1 , u : 4 , w : 7...
并查集是一种树型的数据结构,用于处理一些不相交集合的合并问题。 并查集的主要操作有 1-合并两个不相交集合 2-判断两个元素是否属于同一个集合 3-路径压缩
DisjointSet disjointSet = new DisjointSet(vertices); // 按权重排序边 edges.Sort(); // 求解最小生成树 foreach (Edge edge in edges) { int uRoot = disjointSet.Find(edge.From); int vRoot = ...
【标题】"北大ACM培训课ppt1"揭示了这是一份来自北京大学的关于ACM竞赛编程培训的课程资料,主要包含两部分:gw_dfa.ppt和gw_Disjoint Set.pptx。ACM(国际大学生程序设计竞赛,International Collegiate ...
ds = new DisjointSet(edges.Select(e => e.From).Union(edges.Select(e => e.To)).Count()); } public List<Edge> GetMinimumSpanningTree() { var mst = new List(); foreach (var edge in edges) { if (!...
3. 从最小的边开始遍历,如果这条边连接的两个顶点不在同一个连通分量中,就将其加入最小生成树,并更新Disjoint Set。 4. 继续检查下一条边,直到连通了所有顶点为止。 Prim算法则有所不同,它从一个初始顶点开始...
- 最大和最小堆、优先队列、Trie、树、二叉搜索树、AVL树、红黑树、区段树 - 包含最小/最大/总和范围查询示例、Fenwick Tree(二叉索引树)、图形(有向和无向)、 Disjoint Set - 并集-查找数据结构或合并-查找集、...
DisjointSet ds = new DisjointSet(); // 将所有边添加到优先队列,并设置边的起始顶点和结束顶点 for (int i = 0; i ; i++) { for (int j = i + 1; j [i].length; j++) { if (graph[i][j] != 0) { pq.offer...
Disjoint Set Union是一种用于管理一组不相交集合的数据结构,它提供了两种基本操作:Find(查找元素所属的集合)和Union(合并两个集合)。这个数据结构在处理并查集问题时非常有效,例如在网络连接、图论问题或...
- 并查集类(DisjointSet):实现并查集数据结构,提供合并和查找操作。 通过分析这个代码,你可以深入理解Kruskal算法的细节,以及如何将其应用于实际的离散型优化问题。这将有助于你在解决涉及网络连接、成本最小...
首先,我们要理解【描述】中提到的"群星璀璨(12):白植科、唐斌斌、夏可鑫",这可能是参赛者的名字,暗示了ACM竞赛的团队性质,而"第十三讲并查集(Disjoint Set)"则揭示了本次训练的重点是学习并查集这一数据...